RocketMQ 发送消息与消费

前面我们已经安装好了 RocketMQ,现在就开始测试下相关的操作,安装的链接看这里.。

消息处理分析

消息发送者步骤分析

1. 创建消息生产者 producer,并指定生产者组名

2. 指定 Nameserver 地址

3. 启动 producer

4. 创建消息对象,指定主题 Topic、Tag和消息体

5. 发送消息

6. 关闭生产者 producer

消息消费者步骤分析

1.创建消费者 Consumer,指定消费者组名

2.指定 Nameserver 地址

3.订阅主题 Topic和 Tag

4.设置回调函数,处理消息

5.启动消费者 consumer

消息生命周期

普通消息生命周期

  • 初始化:消息被生产者构建并完成初始化,待发送到服务端的状态。

  • 待消费:消息被发送到服务端,对消费者可见,等待消费者消费的状态。

  • 消费中:消息被消费者获取,并按照消费者本地的业务逻辑进行处理的过程。 此时服务端会等待消费者完成消费并提交消费结果,如果一定时间后没有收到消费者的响应,Apache RocketMQ会对消息进行重试处理。具体信息,请参见消费重试。

  • 消费提交:消费者完成消费处理,并向服务端提交消费结果,服务端标记当前消息已经被处理(包括消费成功和失败)。 Apache RocketMQ默认支持保留所有消息,此时消息数据并不会立即被删除,只是逻辑标记已消费。消息在保存时间到期或存储空间不足被删除前,消费者仍然可以回溯消息重新消费。

  • 消息删除:Apache RocketMQ按照消息保存机制滚动清理最早的消息数据,将消息从物理文件中删除。更多信息,请参见消息存储和清理机制。

消息发送

发送同步消息

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

public class SyncProducer {
    public static void main(String[] args) throws Exception {
        // 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer("produceGroup");
        // 设置NameServer的地址
        producer.setNamesrvAddr("192.168.152.130:9876");
        // 启动Producer实例
        producer.start();
        for (int i = 0; i < 100; i++) {
            // 创建消息,并指定Topic,Tag和消息体
            Message msg = new Message("TopicTest" /* Topic */,
            "TagA" /* Tag */,
            ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
            );
            // 发送消息到一个Broker
            SendResult sendResult = producer.send(msg);
            // 通过sendResult返回消息是否成功送达
            System.out.printf("%s%n", sendResult);
        }
        // 如果不再发送消息,关闭Producer实例。
        producer.shutdown();
    }
}

发送异步消息

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

public class AsyncProducer {
    public static void main(String[] args) throws Exception {
        // 1:实例化消息生产者 Producer,  指定生产组名称
        DefaultMQProducer producer = new DefaultMQProducer("produceGroup");
        // 2:设置NameServer的地址
        producer.setNamesrvAddr("192.168.152.130:9876");
        // 3:启动Producer实例
        producer.start();
        producer.setRetryTimesWhenSendAsyncFailed(0);

        for (int i = 0; i < 10; i++) {
            // 4:创建消息,并指定 Topic,Tag 和 消息体
            /*
               参数一: 消息主题
               参数二: 消息 tag
               参数三: 消息内容
             */
            Message msg = new Message("TopicTest", "TagB", ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));

            // 5:发送消息到一个Broker
            producer.send(msg, new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    System.out.println("发送结果:" + sendResult);
                }

                @Override
                public void onException(Throwable throwable) {
                    System.out.println("发送异常:" + throwable.getMessage());
                }
            });


            TimeUnit.SECONDS.sleep(1);
        }

        // 6:如果不再发送消息,关闭Producer实例。
//        producer.shutdown();
    }
}

发送单向消息

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

public class OneWayProducer {

    public static void main(String[] args) throws Exception {
        // 1:实例化消息生产者 Producer,  指定生产组名称
        DefaultMQProducer producer = new DefaultMQProducer("produceGroup");
        // 2:设置NameServer的地址
        producer.setNamesrvAddr("192.168.152.130:9876");
        // 3:启动Producer实例
        producer.start();

        for (int i = 0; i < 10; i++) {
            // 4:创建消息,并指定 Topic,Tag 和 消息体
            /*
               参数一: 消息主题
               参数二: 消息 tag
               参数三: 消息内容
             */
            Message msg = new Message("TopicTest", "TagC", ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));

            // 5:发送单向消息,没有任何返回结果
            producer.sendOneway(msg);
        }

        // 6:如果不再发送消息,关闭Producer实例。
        producer.shutdown();
    }
}

消息消费

public class Consumer {

    public static void main(String[] args) throws Exception {
        // 1. 创建消费者,指定消费者组名
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("produceGroup");

        // 2. 指定 NameSever 地址
        consumer.setNamesrvAddr("192.168.152.130:9876");

        // 3. 订阅主题 Topic 和 tag
        consumer.subscribe("TopicTest", "TagB");

        // 4. 设置回调函数,处理消息
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
//                System.out.println(list);

                list.forEach( messageExt -> System.out.println(new String(messageExt.getBody())));
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        
        // 启动消费者
        consumer.start();
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wayfreem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值