RocketMQ〖三〗消息发送,同步消息,异步消息,单向消息,消息消费

一. 开始步骤,创建springboot项目

  • 导入MQ客户端依赖
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.4.0</version>
</dependency>
  • 消息发送者步骤分析r
1.创建消息生产者producer,并制定生产者组名
2.指定Nameserver地址
3.启动producer
4.创建消息对象,指定主题Topic、Tag和消息体
5.发送消息
6.关闭生产者producer
  • 消息消费者步骤分析
1.创建消费者Consumer,制定消费者组名
2.指定Nameserver地址
3.订阅主题Topic和Tag
4.设置回调函数,处理消息
5.启动消费者consumer

二. 消息发送

1)发送同步消息

这种可靠性同步地发送方式使用的比较广泛,比如:重要的消息通知,短信通知。

public class SyncProducer {

    public static void main(String[] args) throws Exception {
        //1.创建消息生产者producer,并制定生产者组名
        DefaultMQProducer producer = new DefaultMQProducer("group1");
        //2.指定Nameserver地址
        producer.setNamesrvAddr("一号服务器公网IP:9876;二号服务器公网IP:9876");
        //3.启动producer
        producer.start();

        for (int i = 0; i < 10; i++) {
            //4.创建消息对象,指定主题Topic、Tag和消息体
            /**
             * 参数一:消息主题Topic
             * 参数二:消息Tag
             * 参数三:消息内容
             */
            Message msg = new Message("springboot-mq", "Tag1", ("Hello World" + i).getBytes());
            //5.发送消息
            SendResult result = producer.send(msg);
            //发送状态
            SendStatus status = result.getSendStatus();

            System.out.println("发送结果:" + result);

            //线程睡1秒
            TimeUnit.SECONDS.sleep(1);
        }

        //6.关闭生产者producer
        producer.shutdown();
    }
}

运行结果

发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032505B000B4AAC231B76AA50000, offsetMsgId=3B6E9E5D00002A9F0000000000001780, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-b, queueId=3], queueOffset=7]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032505B000B4AAC231B76F0E0001, offsetMsgId=3B6E9E5D00002A9F0000000000001832, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-b, queueId=0], queueOffset=7]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032505B000B4AAC231B7731A0002, offsetMsgId=3B6E9E5D00002A9F00000000000018E4, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-b, queueId=1], queueOffset=8]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032505B000B4AAC231B777270003, offsetMsgId=3B6E9E5D00002A9F0000000000001996, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-b, queueId=2], queueOffset=8]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032505B000B4AAC231B77B350004, offsetMsgId=3B6E9E5D00002A9F0000000000001A48, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-b, queueId=3], queueOffset=8]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032505B000B4AAC231B77F430005, offsetMsgId=3B6E9E5D00002A9F0000000000001AFA, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-b, queueId=0], queueOffset=8]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032505B000B4AAC231B783500006, offsetMsgId=3B6E9E5D00002A9F0000000000001BAC, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-b, queueId=1], queueOffset=9]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032505B000B4AAC231B7875D0007, offsetMsgId=3B6E9E5D00002A9F0000000000001C5E, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-b, queueId=2], queueOffset=9]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032505B000B4AAC231B78B6E0008, offsetMsgId=3B6E9E5D00002A9F0000000000001D10, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-b, queueId=3], queueOffset=9]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032505B000B4AAC231B78F7D0009, offsetMsgId=3B6E9E5D00002A9F0000000000001DC2, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-b, queueId=0], queueOffset=9]
2)发送异步消息

异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。

public class AsyncProducer {

    public static void main(String[] args) throws Exception {
        //1.创建消息生产者producer,并制定生产者组名
        DefaultMQProducer producer = new DefaultMQProducer("group1");
        //2.指定Nameserver地址
        producer.setNamesrvAddr("一号服务器公网IP:9876;二号服务器公网IP:9876");
        //3.启动producer
        producer.start();

        for (int i = 0; i < 10; i++) {
            //4.创建消息对象,指定主题Topic、Tag和消息体
            /**
             * 参数一:消息主题Topic
             * 参数二:消息Tag
             * 参数三:消息内容
             */
            Message msg = new Message("base", "Tag2", ("Hello World" + i).getBytes());
            //5.发送异步消息
            producer.send(msg, new SendCallback() {
                /**
                 * 发送成功回调函数
                 * @param sendResult
                 */
                public void onSuccess(SendResult sendResult) {
                    System.out.println("发送结果:" + sendResult);
                }

                /**
                 * 发送失败回调函数
                 * @param e
                 */
                public void onException(Throwable e) {
                    System.out.println("发送异常:" + e);
                }
            });

            //线程睡1秒
            TimeUnit.SECONDS.sleep(1);
        }

        //6.关闭生产者producer
        producer.shutdown();
    }

发送结果

发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032509E400B4AAC231BF7F330000, offsetMsgId=3B6E9E5D00002A9F0000000000001E74, messageQueue=MessageQueue [topic=base, brokerName=broker-b, queueId=2], queueOffset=0]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032509E400B4AAC231BF7F330001, offsetMsgId=2760560400002A9F00000000000003F6, messageQueue=MessageQueue [topic=base, brokerName=broker-a, queueId=2], queueOffset=2]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032509E400B4AAC231BF83130002, offsetMsgId=3B6E9E5D00002A9F0000000000001F1D, messageQueue=MessageQueue [topic=base, brokerName=broker-b, queueId=2], queueOffset=1]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032509E400B4AAC231BF86FC0003, offsetMsgId=3B6E9E5D00002A9F0000000000001FC6, messageQueue=MessageQueue [topic=base, brokerName=broker-b, queueId=3], queueOffset=0]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032509E400B4AAC231BF8AE50004, offsetMsgId=2760560400002A9F000000000000049F, messageQueue=MessageQueue [topic=base, brokerName=broker-a, queueId=3], queueOffset=1]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032509E400B4AAC231BF8ECC0005, offsetMsgId=2760560400002A9F0000000000000548, messageQueue=MessageQueue [topic=base, brokerName=broker-a, queueId=3], queueOffset=2]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032509E400B4AAC231BF92B50006, offsetMsgId=3B6E9E5D00002A9F000000000000206F, messageQueue=MessageQueue [topic=base, brokerName=broker-b, queueId=1], queueOffset=2]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032509E400B4AAC231BF969E0007, offsetMsgId=3B6E9E5D00002A9F0000000000002118, messageQueue=MessageQueue [topic=base, brokerName=broker-b, queueId=2], queueOffset=2]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032509E400B4AAC231BF9A870008, offsetMsgId=2760560400002A9F00000000000005F1, messageQueue=MessageQueue [topic=base, brokerName=broker-a, queueId=3], queueOffset=3]
发送结果:SendResult [sendStatus=SLAVE_NOT_AVAILABLE, msgId=C0A8032509E400B4AAC231BF9E6F0009, offsetMsgId=3B6E9E5D00002A9F00000000000021C1, messageQueue=MessageQueue [topic=base, brokerName=broker-b, queueId=3], queueOffset=1]
3)单向发送消息

这种方式主要用在不特别关心发送结果的场景,例如日志发送。

/**
 * 发送单向消息
 */
public class OneWayProducer {

    public static void main(String[] args) throws Exception, MQBrokerException {
        //1.创建消息生产者producer,并制定生产者组名
        DefaultMQProducer producer = new DefaultMQProducer("group1");
        //2.指定Nameserver地址
        producer.setNamesrvAddr("一号服务器公网IP:9876;二号服务器公网IP:9876");
        //3.启动producer
        producer.start();

        for (int i = 0; i < 3; i++) {
            //4.创建消息对象,指定主题Topic、Tag和消息体
            /**
             * 参数一:消息主题Topic
             * 参数二:消息Tag
             * 参数三:消息内容
             */
            Message msg = new Message("base", "Tag3", ("Hello World,单向消息" + i).getBytes());
            //5.发送单向消息
            producer.sendOneway(msg);

            //线程睡1秒
            TimeUnit.SECONDS.sleep(5);
        }

        //6.关闭生产者producer
        producer.shutdown();
    }
}
4)发送状态为sendStatus=SLAVE_NOT_AVAILABLE,但集群都好着呢,什么原因造成的有待考察,评论区的大神帮帮我~

三. 消息消费

1) 负载均衡模式(默认)

消费者采用负载均衡方式消费消息,多个消费者共同消费队列消息,每个消费者处理的消息不同

public class Consumer {

    public static void main(String[] args) throws Exception {
        //1.创建消费者Consumer,制定消费者组名
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");
        //2.指定Nameserver地址
        consumer.setNamesrvAddr("39.96.86.4:9876;59.110.158.93:9876");
        //3.订阅主题Topic和Tag
        consumer.subscribe("springboot-mq", "Tag1")
        
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                System.out.println(list);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        //5.启动消费者consumer
        consumer.start();
    }
}

消费信息

[MessageExt [queueId=0, storeSize=178, queueOffset=3, sysFlag=0, bornTimestamp=1581266391102, bornHost=/36.41.156.59:38339, storeTimestamp=1581266391444, storeHost=/59.110.158.93:10911, msgId=3B6E9E5D00002A9F0000000000000BD2, commitLogOffset=3026, bodyCRC=1761454578, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='springboot-mq', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=16, CONSUME_START_TIME=1581329437443, UNIQ_KEY=C0A80325055800B4AAC22E7DB83E0007, WAIT=true, TAGS=Tag1}, body=[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 55], transactionId='null'}]]
[MessageExt [queueId=0, storeSize=178, queueOffset=12, sysFlag=0, bornTimestamp=1581322213951, bornHost=/36.41.156.59:39835, storeTimestamp=1581322214204, storeHost=/59.110.158.93:10911, msgId=3B6E9E5D00002A9F00000000000027FA, commitLogOffset=10234, bodyCRC=2017637475, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='springboot-mq', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=16, CONSUME_START_TIME=1581329437446, UNIQ_KEY=C0A803252B2000B4AAC231D1823F0008, WAIT=true, TAGS=Tag1}, body=[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 56], transactionId='null'}]]
[MessageExt [queueId=0, storeSize=178, queueOffset=11, sysFlag=0, bornTimestamp=1581322209826, bornHost=/36.41.156.59:39835, storeTimestamp=1581322210079, storeHost=/59.110.158.93:10911, msgId=3B6E9E5D00002A9F0000000000002532, commitLogOffset=9522, bodyCRC=1911879752, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='springboot-mq', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=16, CONSUME_START_TIME=1581329437446, UNIQ_KEY=C0A803252B2000B4AAC231D172220004, WAIT=true, TAGS=Tag1}, body=[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 52], transactionId='null'}]]
[MessageExt [queueId=0, storeSize=178, queueOffset=15, sysFlag=0, bornTimestamp=1581322599135, bornHost=/36.41.156.59:39947, storeTimestamp=1581322599392, storeHost=/59.110.158.93:10911, msgId=3B6E9E5D00002A9F0000000000002EEE, commitLogOffset=12014, bodyCRC=2017637475, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='springboot-mq', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=16, CONSUME_START_TIME=1581329437446, UNIQ_KEY=C0A8032513C000B4AAC231D762DF0008, WAIT=true, TAGS=Tag1}, body=[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 56], transactionId='null'}]]
[MessageExt [queueId=0, storeSize=178, queueOffset=9, sysFlag=0, bornTimestamp=1581320513405, bornHost=/36.41.156.59:41650, storeTimestamp=1581320513647, storeHost=/59.110.158.93:10911, msgId=3B6E9E5D00002A9F0000000000001DC2, commitLogOffset=7618, bodyCRC=256214261, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='springboot-mq', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=16, CONSUME_START_TIME=1581329437443, UNIQ_KEY=C0A8032505B000B4AAC231B78F7D0009, WAIT=true, TAGS=Tag1}, body=[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 57], transactionId='null'}]]
[MessageExt [queueId=0, storeSize=178, queueOffset=10, sysFlag=0, bornTimestamp=1581322205664, bornHost=/36.41.156.59:39835, storeTimestamp=1581322205951, storeHost=/59.110.158.93:10911, msgId=3B6E9E5D00002A9F000000000000226A, commitLogOffset=8810, bodyCRC=1989753937, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='springboot-mq', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=16, CONSUME_START_TIME=1581329437443, UNIQ_KEY=C0A803252B2000B4AAC231D161DE0000, WAIT=true, TAGS=Tag1}, body=[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 48], transactionId='null'}]]
[MessageExt [queueId=0, storeSize=178, queueOffset=7, sysFlag=0, bornTimestamp=1581320505102, bornHost=/36.41.156.59:41650, storeTimestamp=1581320505343, storeHost=/59.110.158.93:10911, msgId=3B6E9E5D00002A9F0000000000001832, commitLogOffset=6194, bodyCRC=27135175, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='springboot-mq', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=16, CONSUME_START_TIME=1581329437443, UNIQ_KEY=C0A8032505B000B4AAC231B76F0E0001, WAIT=true, TAGS=Tag1}, body=[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 49], transactionId='null'}]]
[MessageExt [queueId=0, storeSize=178, queueOffset=8, sysFlag=0, bornTimestamp=1581320509251, bornHost=/36.41.156.59:41650, storeTimestamp=1581320509493, storeHost=/59.110.158.93:10911, msgId=3B6E9E5D00002A9F0000000000001AFA, commitLogOffset=6906, bodyCRC=116639966, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='springboot-mq', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=16, CONSUME_START_TIME=1581329437443, UNIQ_KEY=C0A8032505B000B4AAC231B77F430005, WAIT=true, TAGS=Tag1}, body=[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 53], transactionId='null'}]]
[MessageExt [queueId=0, storeSize=178, queueOffset=14, sysFlag=0, bornTimestamp=1581322594996, bornHost=/36.41.156.59:39947, storeTimestamp=1581322595254, storeHost=/59.110.158.93:10911, msgId=3B6E9E5D00002A9F0000000000002C26, commitLogOffset=11302, bodyCRC=1911879752, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='springboot-mq', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=16, CONSUME_START_TIME=1581329437446, UNIQ_KEY=C0A8032513C000B4AAC231D752B40004, WAIT=true, TAGS=Tag1}, body=[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 52], transactionId='null'}]]
[MessageExt [queueId=0, storeSize=178, queueOffset=13, sysFlag=0, bornTimestamp=1581322590782, bornHost=/36.41.156.59:39947, storeTimestamp=1581322591097, storeHost=/59.110.158.93:10911, msgId=3B6E9E5D00002A9F000000000000295E, commitLogOffset=10590, bodyCRC=1989753937, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='springboot-mq', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=16, CONSUME_START_TIME=1581329437446, UNIQ_KEY=C0A8032513C000B4AAC231D7423D0000, WAIT=true, TAGS=Tag1}, body=[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 48], transactionId='null'}]]

2) 广播模式

指的是不同的comsumer接收到的消息是一样的

public class Consumer {

    public static void main(String[] args) throws Exception {
        //1.创建消费者Consumer,制定消费者组名
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");
        //2.指定Nameserver地址
        consumer.setNamesrvAddr("39.96.86.4:9876;59.110.158.93:9876");
        //3.订阅主题Topic和Tag
        consumer.subscribe("base", "Tag2");

        consumer.setMessageModel(MessageModel.BROADCASTING);

        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                System.out.println(list);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        //5.启动消费者consumer
        consumer.start();
    }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值