SpringBoot 整合 RocketMQ 实现消息生产消费(RocketMQTemplate实现)

    有时候我们在使用消息队列的时候,往往需要能够保证消息的顺序消费,而RocketMQ是可以支持消息的顺序消费的。
    RocketMQ在发送消息的时候,是将消息发送到不同的队列中,然后消费端从多个队列中读取消息进行消费,很明显,在这种全局模式下,是无法实现顺序消费的。
    为了实现顺序消费,我们需要把有顺序的消息按照他的顺序,将他们发送到同一个队列中,这样消费端在消费的时候,就保证了其顺序。
    但是顺序消费的性能肯定也相对差一些,因为只能使用一个队列。

一、在pom.xml中添加依赖:

<dependency>
      <groupId>org.apache.rocketmq</groupId>
      <artifactId>rocketmq-spring-boot-starter</artifactId>
      <version>2.1.0</version>
</dependency>

二、在application.yml中配置RocketMQ地址:

server:
  port: 8888
rocketmq:
  name-server: 127.0.0.1:9876
  producer:
    group: ${spring.application.name}
    sendMessageTimeout: 300000

 备注:官方下载RocketMQ,本地启动RocketMQ。

三、 一个简单的生产消费案例:

生产者:向 stringTopic 的主题中发送一个 Hello RecketMQ 的字符串。

@RestController
@RequestMapping("/mq")
public class ProducerController {
    @Resource
    private RocketMQTemplate rocketMQTemplate;

    @RequestMapping("/sync/send1")
    public String syncSendString() {
        //发送一个同步消息,会返回值 ---发送到 stringTopic 主题
        SendResult sendResult = rocketMQTemplate.syncSend("stringTopic", "Hello RocketMQ");
        return sendResult.toString();
    }
}

消费者:监听 stringTopic 主题。

@Service
@RocketMQMessageListener(topic = "stringTopic", consumerGroup = "string_consumer")
public class StringConsumer implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        System.out.println("消费者接收消息:" + message);
    }
}

1、启动当前服务。
2、用浏览器或者HTTP Client工具访问:http://localhost:8888/mq/sync/send1
3、查看控制台输出:【消费者接收消息:Hello RocketMQ】即表示消息消费成功。

四、实现顺序消费

生产者: 生产多条消息,方便观察顺序。向 orderTopic 主题发送5条消息,内容分别是 no1 no2 no3 no4 no5。第三个参数是order ,他的作用是会根据他的hash值计算发送到哪一个队列。用同一个值order,那么他们的hash一样。可以保证发送到同一个队列里。

@RestController
@RequestMapping("/mq")
public class ProducerController {
    @Resource
    private RocketMQTemplate rocketMQTemplate;
    
    /**************验证RocketMQ顺序消费***************/
    @RequestMapping("/send/ordered")
    public String sendOrderedMsg(){
        /**
         * hashKey: 为了保证报到同一个队列中,将消息发送到orderTopic主题上
         */
        rocketMQTemplate.syncSendOrderly("orderTopic","no1","order");
        rocketMQTemplate.syncSendOrderly("orderTopic","no2","order");
        rocketMQTemplate.syncSendOrderly("orderTopic","no3","order");
        rocketMQTemplate.syncSendOrderly("orderTopic","no4","order");
        rocketMQTemplate.syncSendOrderly("orderTopic","no5","order");
        return "success";
    }
}

消费者:消费者在消费的时候,默认是异步多线程消费的,所以无法保证顺序,需要指定同步消费。指定 consumeMode = ConsumeMode.ORDERLY。默认值是  consumeMode = ConsumeMode.CONCURRENT。

@Service
@RocketMQMessageListener(topic = "orderTopic", consumerGroup = "ordered-consumer", consumeMode = ConsumeMode.ORDERLY)
public class OrderedConsumer implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        System.out.println("顺序消费,收到消息:" + message);
    }
}

1、启动当前服务。
2、用浏览器或者HTTP Client工具访问:http://localhost:8888/mq/send/ordered
3、查看控制台输出:【顺序打印:no1  no2   no3   no4   no5】即表示消息消费成功。

备注:rocketmq启动服务和关闭服务。 

# rocketmq启动服务
start mqnamesrv.cmd
start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true

# rocketmq关闭服务
start mqshutdown.cmd broker
start mqshutdown.cmd namesrv
SpringBoot整合RocketMQ发送事务消息的步骤如下: 首先,定义一个生产者类,使用@Component注解将其标记为一个组件,并使用@Autowired注解注入RocketMQTemplate实例。在该类中,可以编写一个sendMsg方法来发送消息。该方法接受两个参数,分别是topic和msg,使用MessageBuilder构建一个消息对象,并通过rocketMQTemplate的sendMessageInTransaction方法发送消息。需要注意的是,该方法的第一个参数要与@RocketMQTransactionListener注解中的txProducerGroup属性保持一致。\[1\] 其次,定义一个消费者类,使用@Component和@RocketMQMessageListener注解将其标记为一个组件,并指定topic和consumerGroup。该类需要实现RocketMQListener接口,并实现其中的onMessage方法,用于处理接收到的消息。\[2\] 最后,在引导类中使用@SpringBootApplication注解标记该类为Spring Boot应用程序的入口,并在main方法中调用SpringApplication的run方法启动应用程序。\[3\] 通过以上步骤,就可以在SpringBoot整合RocketMQ发送事务消息了。 #### 引用[.reference_title] - *1* *2* *3* [springboot 整合 rocketmq 发送事务消息](https://blog.csdn.net/weixin_42494845/article/details/109362030)[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^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值