【MQ-02】基于SpringBoot的RocketMQ简单Demo(附源码)

4 篇文章 0 订阅

源码

官方文档

Maven依赖

<dependency>
        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-client</artifactId>
        <version>4.3.0</version>
</dependency>

开发生产者Producer

  • 在此为了方便查看效果,生产者消费者是分开两个项目的。
package com.example.demo.service;

import io.netty.util.internal.ThreadExecutorMap;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * 生产者
 */
@Service
public class ProducerService {

    /**
     * 初始化
     */
    public static void main(String[] args) throws Exception {
        // 创建一个带组名的生产者实例
        DefaultMQProducer producer = new
                DefaultMQProducer("please_rename_unique_group_name");
        // 指定MQ服务ID地址/域名
        producer.setNamesrvAddr("localhost:9876");
        // 启动生产者实例
        producer.start();
        for (int i = 0; i < 10; i++) {
            // 创建消息实例, 指定topic, tag和消息体.
            Message msg = new Message("TopicTest",
                    "TagA",
                    ("Hello RocketMQ " +
                            i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
            );
            // 调用发送消息方法来传递消息到其中一个broker
            SendResult sendResult = producer.send(msg);
//                System.out.printf("%s%n", sendResult);
            System.out.printf("发送消息的ID:%s, ---发送消息的状态:%s%n", sendResult.getMsgId(), sendResult.getSendStatus());
        }
        // 不常使用的话,关闭生产者实例
        producer.shutdown();
    }

}

消费者

package com.example.demo.servcie;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.List;

/**
 * 消费者
 */
@Service
public class ConsumerService {

    public static void main(String[] args) throws MQClientException {
        // 创建一个带组名的消费者实例
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name");

        // 指定MQ服务IP地址/域名
        consumer.setNamesrvAddr("localhost:9876");

        // 为消费者订阅一个或多个topics
        consumer.subscribe("TopicTest", "*");

        // 从broker拿到的消息之后执行的方法,do sth.
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                            ConsumeConcurrentlyContext context) {
//                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                for (MessageExt msg: msgs ) {
                        System.out.println("收到消息:" + new String(msg.getBody()));
                    }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });

        // 启动消费者实例
        consumer.start();

        System.out.printf("消费者已准备就绪.%n");
    }

}

运行

  • 先启动消费者,再启动生产者。
消费者

在这里插入图片描述

生产者

在这里插入图片描述

启动生产者之后的消费者

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBootRocketMQ的整合可以通过添加依赖和配置来实现。首先,在POM文件中添加RocketMQ的依赖。然后,可以创建生产者和消费者来发送和接收消息。 在RocketMQ中,消息重复是无法避免的,所以如果业务对消费重复非常敏感,需要在业务层面进行去重处理。可以借助关系数据库进行去重。可以使用消息的唯一键(如msgId或消息内容中的唯一标识字段)来判断消息是否已经存在于数据库中。如果不存在,则插入并进行消费,否则跳过。需要注意的是,判断是否存在时要考虑原子性问题,可以尝试插入,如果报主键冲突,则插入失败,直接跳过。 为了处理消费速度慢的情况,可以提高消费并行度,即增加消费者的数量。 为什么将DB重试方式要求应用自己完成而不是集成到MQ客户端内部呢?这是因为MQ的客户端设计为无状态模式,方便任意的水平扩展,并且对机器资源的消耗较小。如果MQ客户端内部集成了KV存储模块,那么数据只有同步落盘才能较可靠,但同步落盘的性能开销较大。另外,应用的关闭过程可能是由应用自己控制的,可能会出现暴力关闭的情况,导致数据没有及时落盘而丢失。此外,Producer所在机器的可靠性较低,一般为虚拟机,不适合存储重要数据。因此,建议将重试过程交由应用来控制。 在消费过程中,可以通过幂等性来处理重复消费的问题,即使相同的消息被消费多次,也不会对业务产生影响。 总结起来,SpringBootRocketMQ的整合可以通过添加依赖和配置来实现,可以借助关系数据库进行消息去重处理,可以提高消费并行度来处理消费速度慢的情况,而将DB重试方式交由应用自己完成是基于MQ客户端设计的无状态模式和可靠性的考虑,消费过程中可以通过幂等性来处理重复消费的问题。 #### 引用[.reference_title] - *1* *2* *3* [rocketMq整合springboot与介绍](https://blog.csdn.net/GZ946/article/details/125531986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值