Apache RocketMQ的入门使用以及坑

实测可用环境: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端即可
Apache RocketMQ的入门使用以及坑_第1张图片
修改bin目录下runbroker.sh和runserver.sh,官方预设的OPT值过高,一般测试环境可能不能运行,将数值调小即可(官方预设的8g 4g 2g直接改成几百m就行)
在这里插入图片描述Apache RocketMQ的入门使用以及坑_第2张图片
此时注意坑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");

至此测试可用
Apache RocketMQ的入门使用以及坑_第3张图片
Apache RocketMQ的入门使用以及坑_第4张图片

你可能感兴趣的:(Apache RocketMQ的入门使用以及坑)