rocketmq——HelloWorld

正常情况先启动Consumer再启动Producer(先订阅再发送),否则消费消息的顺序会错乱。

依赖包:

这里写图片描述

已搭建好了broker和nameserver服务器

Producer类:

public static void main(String[] args) throws MQClientException, InterruptedException {
        DefaultMQProducer producer = new DefaultMQProducer("quickstart_producer");
        producer.setNamesrvAddr("192.168.0.2:9876;192.168.0.3:9876");
        //消息发送失败重试10次
        producer.setRetryTimesWhenSendFailed(10);
        producer.start();
        for(int i=0; i<20; i++) {
            Message msg = new Message("TopicQuickStart","TagA",("Hello " + i).getBytes());
            try {
                SendResult sendResult = producer.send(msg,2000);//2秒钟内未发送成功自动重试
                System.out.println(sendResult);
            } catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
            }
        }

        producer.shutdown();
    }

Consumer类:

public static void main(String[] args) throws MQClientException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("quickstart_consumer");
        //设置consumer第一次启动是从队列头部开始还是尾部开始消费,若非第一次启动,那么按照上次消费的位置继续消费
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        consumer.subscribe("TopicQuickStart", "*");
        //批量消费,一次消费多少条消息,默认为1条,最大情况能拿多少条不代表每次能拿这么多条
        //consumer.setConsumeMessageBatchMaxSize(3);
        consumer.registerMessageListener(new MessageListenerConcurrently() {

            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                //System.out.println(Thread.currentThread().getName() + "Receive: " + msgs);
                //获取一次性消费多少条消息
                //System.out.println("消息条数 : " + msgs.size());
                MessageExt msg1 = null;
                try {
                    for(MessageExt msg : msgs) {
                        msg1 = msg;
                        String topic = msg.getTopic();
                        String msgbody = new String(msg.getBody(),"utf-8");
                        String tag = msg.getTags();
                        System.out.println("收到消息: " + "topic:" + topic + " tags:" + tag + " msg:" + msgbody);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    //若已经重试了5次则不再重试
                    if(msg1.getReconsumeTimes() == 5) {
                        //此处记录日志操作。。。
                        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                    }
                    return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                }

                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.setNamesrvAddr("192.168.0.2:9876;192.168.0.3:9876");
        consumer.start();
        System.out.println("Consumer started...");
    }

producer coonsole:

SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F0000000000000C84, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=0], queueOffset=6]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F0000000000000D09, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=1], queueOffset=6]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F0000000000000D8E, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=2], queueOffset=6]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F0000000000000E13, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=3], queueOffset=6]
SendResult [sendStatus=SEND_OK, msgId=C0A8000300002A9F0000000000000858, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-b, queueId=0], queueOffset=4]
SendResult [sendStatus=SEND_OK, msgId=C0A8000300002A9F00000000000008DD, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-b, queueId=1], queueOffset=4]
SendResult [sendStatus=SEND_OK, msgId=C0A8000300002A9F0000000000000962, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-b, queueId=2], queueOffset=4]
SendResult [sendStatus=SEND_OK, msgId=C0A8000300002A9F00000000000009E7, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-b, queueId=3], queueOffset=4]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F0000000000000E98, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=0], queueOffset=7]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F0000000000000F1D, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=1], queueOffset=7]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F0000000000000FA2, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=2], queueOffset=7]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F0000000000001028, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=3], queueOffset=7]
SendResult [sendStatus=SEND_OK, msgId=C0A8000300002A9F0000000000000A6C, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-b, queueId=0], queueOffset=5]
SendResult [sendStatus=SEND_OK, msgId=C0A8000300002A9F0000000000000AF2, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-b, queueId=1], queueOffset=5]
SendResult [sendStatus=SEND_OK, msgId=C0A8000300002A9F0000000000000B78, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-b, queueId=2], queueOffset=5]
SendResult [sendStatus=SEND_OK, msgId=C0A8000300002A9F0000000000000BFE, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-b, queueId=3], queueOffset=5]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F00000000000010AE, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=0], queueOffset=8]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F0000000000001134, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=1], queueOffset=8]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F00000000000011BA, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=2], queueOffset=8]
SendResult [sendStatus=SEND_OK, msgId=C0A8000200002A9F0000000000001240, messageQueue=MessageQueue [topic=TopicQuickStart, brokerName=broker-a, queueId=3], queueOffset=8]

consumer console:

Consumer started...
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 0
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 1
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 2
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 3
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 4
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 5
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 6
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 7
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 8
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 9
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 10
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 11
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 12
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 13
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 14
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 15
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 16
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 17
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 18
收到消息: topic:TopicQuickStart tags:TagA msg:Hello 19

访问控制台:

这里写图片描述

broker集群和consumer端集群自动支持负载均衡,即同一个group的broker和订阅同一个主题的consumer。

Consumer端重试机制

1.timeout:
MQ发送到Consumer失败,没有返回值,重试次数是无限制的,会给Consumer集群轮着重新发送。

2.exception:
MQ发送到Consumer报异常,返回值为RECONSUME_LATER,
MQ重试机制为每次发送时间间隔依次递增,如:1s,2s,5s,10s….,2h,直到重试一定次数或发送成功。

需要在消费端考虑除去重复的消息,可以给每个消息唯一的key标识,在消费时判断key是否已插入数据库。

一、rocketmq入门到精通视频教程目录大纲 001-001_RocketMQ_简介 002-002_RocketMQ_核心概念详解 003-003_RocketMQ_集群构建模型详解(一) 004-004_RocketMQ_集群构建模型详解(二) 005-005_RocketMQ_双主模式集群环境搭建 006-006_RocketMQ_控制台使用讲解 007-007_RocketMQ_Broker配置文件详解 008-008_RocketMQ_helloworld示例讲解 009-009_RocketMQ_整体架构概述详解 010-010_RocketMQ_Producer_API详解 011-011_RocketMQ_Producer_顺序消费机制详解 012-012_RocketMQ_Producer_事务消息机制详解 013-013_RocketMQ_Consumer_Push和Pull模式及使用详解 014-014_RocketMQ_Consumer_配置参数详解 015-015_RocketMQ_Consumer_重试策略详解 016-016_RocketMQ_Consumer_幂等去重策略详解 017-017_RocketMQ_消息模式及使用讲解 018-018_RocketMQ_双主双从集群环境搭建与使用详解 019-019_RocketMQ_FilterServer机制及使用详解 020-020_RocketMQ_管理员命令 二、rocketmq实战视频教程目录大纲 01_rocketmq_实战项目介绍 02_rocketMQ实战项目设计(一) 03_rocketMQ实战项目设计(二) 04_rocketMQ实战-环境搭建(一) 05_rocketMQ实战-环境搭建(二) 06_rocketMQ实战-生产者与spring结合 07_rocketMQ实战-消费者与spring结合 08_rocketMQ实战-数据库模型设计 09_rocketMQ实战-数据库DAO代码生成 10_rocketMQ实战-远程RPC接口设计与实现(一) 11_rocketMQ实战-远程RPC接口设计与实现(二) 12_rocketMQ实战-远程RPC接口设计与实现(三) 13_rocketMQ实战-下单流程(一) 14_rocketMQ实战-下单流程(二) 15_rocketMQ实战-下单流程(三) 16_rocketMQ实战-下单流程(四) 17_rocketMQ实战-下单流程(五) 18_rocketMQ实战-下单流程(六) 19_rocketMQ实战-下单流程(七) 20_rocketMQ实战-下单流程(八)-商品库存 21_rocketMQ实战-下单流程(九)-商品库存 22_rocketMQ实战-下单流程(十)-支付模块 23_rocketMQ实战-整体联调
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值