Java 消息中间件 RocketMQ,代码实践

本文章不会 RocketMQ 做任何深度解析(因为我也不懂),主要从代码角度实现一个实例。

  1. 官方文档:Quick Start Apache RocketMQ
  2. 下载 RocketMQ ,我们这里使用刚刚发布的 4.3.0 版本 RocketMQ Releases
  3. 解压,配置环境变量:ROCKETMQ_HOME:xxxxx/rocketmq-4.3.0
  4. 我们使用 window ,Linux 与之类似,注意每一步的目标就行。
  5. 进入到 ROCKETMQ_HOME/bin 目录下
  6. 启动 mqnamesrv,window 双击 mqnamesrv.cmd,cmd 窗口不要关闭,保持 mqnamesrv 程序运行。
  7. 启动 mqbroker  需要设置参数:-n 127.0.0.1:9876。 window 下开一个 cmd 窗口,进入到 ROCKETMQ_HOME/bin 目录下,输入 mqbroker -n 127.0.0.1:9876 命令,启动。cmd 窗口不要关闭,保持 mqbroker 运行。
  8. 以上已完成 RocketMQ 环境的搭建。
  9. 创建项目工程,添加 rocketmq 依赖。
  10. 编写生产者代码:
//生产者的组名
DefaultMQProducer producer = new DefaultMQProducer("producerGroup");

//指定NameServer地址,多个地址以 ; 隔开
producer.setNamesrvAddr("127.0.0.1:9876");

try {

    /\*\*
     \* Producer对象在使用之前必须要调用start初始化,初始化一次即可
     \* 注意:切记不可以在每次发送消息时,都调用start方法
     */
    producer.start();

    for (int i = 0; i < 100; i++) {

        String messageBody = "我是消息内容:" + i;

        String message = new String(messageBody.getBytes(), "utf-8");

        //构建消息
        Message msg = new Message("MyTopic" /* PushTopic */, "MyTag"/* Tag  */, "key_" + i /* Keys */, message.getBytes());

        //发送消息
        SendResult result = producer.send(msg);

        System.out.println("发送响应:MsgId:" + result.getMsgId() + ",发送状态:" + result.getSendStatus());

    }

} catch (Exception e) {
    e.printStackTrace();
} finally {
    producer.shutdown();
}

  1. 编写消费者代码:
//消费者的组名
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup");

//指定NameServer地址,多个地址以 ; 隔开
consumer.setNamesrvAddr("127.0.0.1:9876");
try {
    //订阅PushTopic下Tag为push的消息
    consumer.subscribe("MyTopic", "MyTag");

    //设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费
    //如果非第一次启动,那么按照上次消费的位置继续消费
    consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME\_FROM\_FIRST_OFFSET);
    consumer.registerMessageListener(new MessageListenerConcurrently() {

        @Override
        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext context) {
            try {
                for (MessageExt messageExt : list) {

                    System.out.println("messageExt: " + messageExt);//输出消息内容

                    String messageBody = new String(messageExt.getBody(), "utf-8");

                    System.out.println("消费响应:Msg: " + messageExt.getMsgId() + ",msgBody: " + messageBody);//输出消息内容

                }
            } catch (Exception e) {
                e.printStackTrace();
                return ConsumeConcurrentlyStatus.RECONSUME_LATER; //稍后再试
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; //消费成功
        }


    });
    consumer.start();
} catch (Exception e) {
    e.printStackTrace();
}

  1. 分别执行这两块代码即可(无先后顺序)

参考:

  1. https://www.cnblogs.com/lsdb/p/7607702.html
  2. https://blog.csdn.net/yucaifu1989/article/details/80960018
  3. https://blog.csdn.net/column/details/23707.html

转载于:https://my.oschina.net/asr/blog/1921280

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值