实测可用环境:centos7 x64(安装环境)
jdk1.8
rocketmq 4.7.0版本(下载地址https://archive.apache.org/dist/rocketmq/4.7.0/rocketmq-all-4.7.0-source-release.zip)
rocketmq 4.7.0的安装--------------------------------
将源文件下载至本机,解压后cmd切换至文件夹下执行(linux虚拟机端装了maven的话也可以在虚拟机端执行)
mvn -Prelease-all -DskipTests clean install -U
等待编译完成后打开mq文件夹目录下distribution\target,可看到编译好的工程,三个文件内容是一致的,随便拉走一个传到linux端即可
修改bin目录下runbroker.sh和runserver.sh,官方预设的OPT值过高,一般测试环境可能不能运行,将数值调小即可(官方预设的8g 4g 2g直接改成几百m就行)
此时注意坑1:如果是希望外网可以访问的话编辑conf目录下的broker.conf,新增一条
brokerIP1=你的外网IP
启动需要依次在bin目录下执行
nohup sh mqnamesrv >/dev/null 2>&1 &
nohup sh mqbroker -n localhost:9876 -c ../conf/broker.conf >/dev/null 2>&1 &
如果没有新增brokerIP1,导致的问题是生产者发送消息时会出错sendDefaultImpl call timeout,MQ此时只会接受内网的消息
切记不要修改mqbroker -n localhost:9876的这个参数,查询到不少有说修改 localhost为你的外网地址,修改以后将会导致mq连接不到实例查看日志中会看到以下错误字样
> 日志位置:vi ~/logs/rocketmqlogs/broker.log
> 出现的错误 RemotingConnectException: connect to xx.xx.xx.xx:9876 failed
由此引出另外一个坑,此时生产者发送消息会产生没有主题的错误
MQClientException: No route info of this topic: TopicTest
这时候再照着这个错误查,南辕北辙…
防火墙端口上,默认配置下需要放行两个端口,9876和10911
吐槽一句,官方吔屎啊,文档中我翻了以下,没有关于broker.conf 的说明,最起码没有放到显眼的位置,反正我是没找到…
工程中使用mq--------------------------------------------------------------
工程使用的jar,以下pom配置二选一即可
rocketmq-spring-boot-starte包含了rocketmq-client 4.6.0
org.apache.rocketmq
rocketmq-spring-boot-starter
2.1.0
包
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
生产者
// 指定分组和MQ地址
DefaultMQProducer producer = new DefaultMQProducer("test_group");
producer.setNamesrvAddr("xx.xx.xx.xx:9876");
//启动生产实例,实际使用要保留producer,不能每次都调start
producer.start();
//消息的主题,副标题,消息体(要求是byte型)
Message msg = new Message("TopicTest", "TagA",
"123".getBytes("utf-8")
);
//发送消息
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
//关闭实例
producer.shutdown();
消费者
// 指定分组和MQ地址
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_cus_group");
consumer.setNamesrvAddr("xx.xx.xx.xx:9876");
//订阅的主题和副标题,副标题为*是订阅主标题下的所有消息
consumer.subscribe("TopicTest", "*");
// 注册一个回调函数,收到消息时触发
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List msgs,
ConsumeConcurrentlyContext context) {
for (MessageExt m : msgs) {
System.out.println("收到了消息:" + new String(m.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//启动消费实例
consumer.start();
System.out.printf("Consumer Started.%n");