RocketMQ如何实现同步发送消息和异步发送消息?

本文介绍了如何在RocketMQ中使用Java实现同步和异步消息发送,包括DefaultMQProducer的使用方法和SendCallback的回调处理。根据业务需求选择合适的发送模式是关键。
摘要由CSDN通过智能技术生成

以下发送消息测试基于已经安装并且配置好rocketmq和rocketmq管理平台,导入rocketmq依赖的基础上进行测试发送消息   

   1.同步发送消息

  • 使用DefaultMQProducer类的send方法进行同步发送消息。在发送消息时,调用send方法并设置SendCallback回调对象为null,即可实现同步发送消息。
  • 同步发送消息的代码示例:
  •  /**
         * 创建生产者测试
         * @throws InterruptedException
         * @throws RemotingException
         * @throws MQClientException
         * @throws MQBrokerException
         * @throws UnsupportedEncodingException
         * @throws UnsupportedEncodingException
         */
        @Test
        public void sandMessageTest() throws InterruptedException, RemotingException, MQClientException, MQBrokerException, UnsupportedEncodingException, UnsupportedEncodingException {
            // 创建一个DefaultMQProducer对象,指定生产者组名为"ProducerGroup"
            DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup");
            // 设置NameServer的地址
            producer.setNamesrvAddr("127.0.0.1:9876");
            // 启动生产者
            producer.start();
            // 创建一个消息对象,指定主题为"Topic",标签为"Tag",消息关键字为"Key",消息内容为"Hello RocketMQ"
            Message message = new Message("Topic", "Tag", "Key", "Hello RocketMQ".getBytes());
            // 发送消息并等待返回结果
            SendResult sendResult = producer.send(message);
            // 打印发送结果状态
            System.out.println("Send Status: " + sendResult.getSendStatus());
            // 关闭生产者
            producer.shutdown();
        }

    响应结果:

  • 2.异步发送消息

  • 使用DefaultMQProducer类的send方法进行异步发送消息,并设置SendCallback回调对象。在SendCallback回调对象中处理消息发送结果。
  • 异步发送消息的代码示例:
 /**
     * 创建生产者测试
     * @throws InterruptedException
     * @throws RemotingException
     * @throws MQClientException
     */
    @Test
    public void sandMessageTest() throws InterruptedException, RemotingException, MQClientException{
        // 创建一个DefaultMQProducer对象,指定生产者组名为"ProducerGroup"
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup3");
        // 设置NameServer的地址
        producer.setNamesrvAddr("127.0.0.1:9876");
        // 启动生产者
        producer.start();
        // 创建一个消息对象,指定主题为"Topic3",标签为"Tag3",消息关键字为"Key3",消息内容为"Hello RocketMQ3"
        Message message = new Message("Topic3", "Tag3", "Key3", "Hello RocketMQ3".getBytes());
        // 发送消息并设置异步发送回调
        producer.send(message, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                // 异步发送成功时的处理逻辑
                System.out.println("Send Status: " + sendResult.getSendStatus());
            }
            @Override
            public void onException(Throwable e) {
                // 异步发送异常时的处理逻辑
                e.printStackTrace();
            }
        });
        // 等待异步发送结果
        Thread.sleep(1000);
        // 关闭生产者
        producer.shutdown();
    }

响应结果:

总结:

同步消息的发送消息方式为 生产者发送一个消息到mq,mq再返回一个完成状态到生产者,接着生产者继续发送一个消息到mq,循环往复直到结束;

异步消息的发送消息方式为 生产者发送一个消息到mq,生产者不需要等待mq返回的完成状态,而是继续发送下一个消息,期间mq也会返回完成状态,循环往复直到结束;

优缺点:

实际开发中,要根据业务特点来使用合适的消息发送方式,像支付业务需要同步处理订单的情况要求保持数据同步一致,就要选用同步消息。而像日志记录这种只需发送无重要业务处理的情况,通常都选用异步消息。

通过以上代码示例,可以实现在RocketMQ中进行同步发送消息和异步发送消息的操作。在实际应用中,可以根据具体的业务需求选择合适的消息发送方式,以满足业务的需求。

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值