Apache RocketMQ的入门使用以及坑

2 篇文章 0 订阅
2 篇文章 0 订阅

实测可用环境: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

工程中使用mq--------------------------------------------------------------
工程使用的jar,以下pom配置二选一即可
rocketmq-spring-boot-starte包含了rocketmq-client 4.6.0

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.1.0</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.apache.rocketmq</groupId>-->
<!--<artifactId>rocketmq-client</artifactId>-->
<!--<version>4.7.0</version>-->
<!--</dependency>-->

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<MessageExt> 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");

至此测试可用
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值