Springboot详细讲解RocketMQ实现顺序消息的发送与消费流程

 更新时间:2022年06月23日 08:36:20   作者:12程序猿  
RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,本篇我们了解如何实现顺序消息的发送与消费

如何实现顺序消息? 需要程序保证发送和消费的是同一个 Queue

rocketmq默认发送的消息是进入多个消息队列,然后消费端多线程并发消费,所以默认情况,不是順序消费消息的;有時候,我们需要顺序消费一批消息,比如电商系统 订单创建、支付、完成操作,需要順序执行;

RocketMQTemplate给我们提供了SendOrderly方法(有多個重载),来实现发送顺序消息;包括以下:

syncSendOrderly,发送同步顺序消息;

asyncSendOrderly,发送异步顺序消息;

sendOneWayOrderly,发送单向顺序消息;

一般我们用syncSendOrderly方法发送同步顺序消息。

参数一:topic 如果想添加tag,可以使用"topic:tag"的写法

参数二:消息内容

参数三:hashKey 使用此参数选择队列。 例如:orderId,productId…

因为broker会管理多个消息队列,这个hashKey参数,主要用来计算选择队列的,一般可以把订单ID,产品ID作为参数值;发送到一个队列,这样方便搞顺序队列;以及消费端接收的时候,默认是并发多线程去接收消息。

RocketMQMessageListener有个属性consumeMode,默认是ConsumeMode.CONCURRENTLY ,我们要改成ConsumeMode.ORDERLY,单线程顺序接收消息;

下面来介绍下 springboot+rockermq 整合实现 顺序消息的发送与消费

一、创建Springboot项目添加rockermq依赖

<!--rocketMq依赖-->
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.2.1</version>
</dependency>

二、配置rocketmq

# 端口
server:
  port: 8083

# 配置 rocketmq
rocketmq:
  name-server: 127.0.0.1:9876
  #生产者
  producer:
    #生产者组名,规定在一个应用里面必须唯一
    group: group1
    #消息发送的超时时间 默认3000ms
    send-message-timeout: 3000
    #消息达到4096字节的时候,消息就会被压缩。默认 4096
    compress-message-body-threshold: 4096
    #最大的消息限制,默认为128K
    max-message-size: 4194304
    #同步消息发送失败重试次数
    retry-times-when-send-failed: 3
    #在内部发送失败时是否重试其他代理,这个参数在有多个broker时才生效
    retry-next-server: true
    #异步消息发送失败重试的次数
    retry-times-when-send-async-failed: 3

三、新建一个controller来做消息发送

package com.example.springbootrocketdemo.controller;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 模拟两个订单发送消息
 *
 * 顺序信息的三种方式:同步、异步、单向
 * syncSendOrderly,发送同步顺序消息;
 * asyncSendOrderly,发送异步顺序消息;
 * sendOneWayOrderly,发送单向顺序消息;
 * 一般我们用第一种发送同步顺序消息;
 * @author qzz
 */
@RestController
public class RocketMQOrderCOntroller {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    /**
     * 发送同步顺序消息
     */
    @RequestMapping("/testSyncOrderSend")
    public void testSyncSend(){
        //参数一:topic   如果想添加tag,可以使用"topic:tag"的写法
        //参数二:消息内容
        //参数三:hashKey 用来计算决定消息发送到哪个消息队列, 一般是订单ID,产品ID等
        rocketMQTemplate.syncSendOrderly("test-topic-orderly","111111创建","111111");
        rocketMQTemplate.syncSendOrderly("test-topic-orderly","111111支付","111111");
        rocketMQTemplate.syncSendOrderly("test-topic-orderly","111111完成","111111");
        rocketMQTemplate.syncSendOrderly("test-topic-orderly","222222创建","222222");
        rocketMQTemplate.syncSendOrderly("test-topic-orderly","222222支付","222222");
        rocketMQTemplate.syncSendOrderly("test-topic-orderly","222222完成","222222");
    }
}

四、创建消费端监听消息消费消息

package com.example.springbootrocketdemo.config;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;
/**
 * 消费顺序消息
 * 配置RocketMQ监听
 *
 * ConsumeMode.ORDERLY:顺序消费
 * @author qzz
 */
@Service
@RocketMQMessageListener(consumerGroup = "test",topic = "test-topic-orderly",consumeMode = ConsumeMode.ORDERLY)
public class RocketMQCommonConsumerListener implements RocketMQListener<String> {
    @Override
    public void onMessage(String s) {
        System.out.println("consumer 顺序消费,收到消息:"+s);
    }
}

五、启动服务测试顺序消息发送与消费

测试成功!

到此这篇关于Springboot详细讲解RocketMQ实现顺序消息的发送与消费流程的文章就介绍到这了,更多相关Springboot顺序消息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis-Plus枚举和自定义主键ID的实现步骤

    MyBatis-Plus枚举和自定义主键ID的实现步骤

    这篇文章主要给大家介绍了关于MyBatis-Plus枚举和自定义主键ID的相关资料,文中通过实例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • java中LinkedList使用迭代器优化移除批量元素原理

    java中LinkedList使用迭代器优化移除批量元素原理

    本文主要介绍了java中LinkedList使用迭代器优化移除批量元素原理,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • java如何读取某个文件夹中的全部文件(包括子文件夹)

    java如何读取某个文件夹中的全部文件(包括子文件夹)

    这篇文章主要介绍了java如何读取某个文件夹中的全部文件(包括子文件夹),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 使用springboot自动配置源码解读

    使用springboot自动配置源码解读

    自动装配是Spring Boot的一个核心特性,允许程序员在开发中更加专注于业务逻辑,而不是花费大量的时间去配置和管理第三方组件,当开发者在pom.xml文件中添加了某个依赖后,Spring Boot通过自动配置的方式,将这些第三方组件的实例自动注入到IOC容器中
    2024-11-11
  • Hibernate+JDBC实现批量插入、更新及删除的方法详解

    Hibernate+JDBC实现批量插入、更新及删除的方法详解

    这篇文章主要介绍了Hibernate+JDBC实现批量插入、更新及删除的方法,结合实例形式较为详细的分析了Hibernate与JDBC针对数据库的批量操作相关实现技巧,需要的朋友可以参考下
    2017-11-11
  • Spring事务不生效的8种原因小结

    Spring事务不生效的8种原因小结

    Spring事务会在几种特定的场景下失效,本文主要介绍了Spring事务不生效的8种原因小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • Java中的时间日期API知识点总结

    Java中的时间日期API知识点总结

    本文给大家总结了Java中的时间日期API知识点以及相关的实例代码分享,有兴趣的朋友参考学习下。
    2018-04-04
  • SpringBoot中的@EnableConfigurationProperties注解原理及用法

    SpringBoot中的@EnableConfigurationProperties注解原理及用法

    在SpringBoot中,@EnableConfigurationProperties注解是一个非常有用的注解,它可以用于启用对特定配置类的支持,在本文中,我们将深入探讨@EnableConfigurationProperties注解,包括它的原理和如何使用,需要的朋友可以参考下
    2023-06-06
  • SpringBoot 搭建架构5种方法示例详解

    SpringBoot 搭建架构5种方法示例详解

    SpringBoot是基于Spring框架的便捷开发框架,通过约定优于配置实现快速构建独立应用,文章介绍了五种搭建SpringBoot项目的方法,包括使用IntelliJ IDEA、Spring官网、阿里云官网以及将现有Maven项目转换为SpringBoot项目,感兴趣的朋友跟随小编一起看看吧
    2025-03-03
  • Java实现数据脱敏的方法详细讲解

    Java实现数据脱敏的方法详细讲解

    这篇文章主要给大家介绍了关于Java实现数据脱敏的相关资料,数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护,需要的朋友可以参考下
    2023-06-06

最新评论