分布式消息队列RocketMQ继承SpringBoot

本文介绍了如何在SpringBoot项目中集成RocketMQ,详细讲解了配置、关键类以及生产者和消费者的方法。RocketMQTemplate提供了同步、异步、单向等多种消息发送方式,消费者通过RocketMQListener接口实现消息消费。此外,还涉及了事务消息、Tag过滤、SQL表达式过滤等功能,确保消息的可靠性和一致性。
摘要由CSDN通过智能技术生成

一、介绍
Springboot 继承RocketMQ:

com.alibaba.cloud
spring-cloud-starter-stream-rocketmq

底层封装了 rocketmq-client

参数设置
application.yml

#rocketmq配置
rocketmq:
name-server: 127.0.0.1:9876

生产者配置

producer:
#生产者组名,规定在一个应用里面必须唯一
group: producerGroup
#消息发送的超时时间 默认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
consumer:
isOnOff: on
# 发送同一类消息设置为同一个group,保证唯一默认不需要设置,rocketmq会使用ip@pid(pid代表jvm名字)作为唯一标识
groupName: sampleGroup
# mq的nameserver地址
namesrvAddr: ip:9876
# 消费者订阅的主题topic和tags(标识订阅该主题下所有的tags),格式: topic~tag1||tag2||tags3;
topic: topic2022
tag: "
"
# 消费者线程数据量
consumeThreadMin: 5
consumeThreadMax: 32
# 设置一次消费信息的条数,默认1
consumeMessageBatchMaxSize: 1
二、关键类
1.RocketMQTemplate:提供了各种操作MQ的发放。

2.RocketMQLocalTransactionListener:本地事务监听器 。

3.RocketMQListener:消费信息监听器 。

4.MessageQueueSelector:消息队列选择策略。

5.DefaultMQProducer:默认的生产者。
三、生产者方法
同步(顺序、普通、延迟消息)消息:

//发送普通同步消息-Object
syncSend(String destination, Object payload)
//发送普通同步消息-Message
syncSend(String destination, Message message)
//发送普通同步消息-Object,并设置发送超时时间
syncSend(String destination, Object payload, long timeout)
//发送普通同步消息-Message,并设置发送超时时间
syncSend(String destination, Message message, long timeout)
//发送普通同步延迟消息,并设置超时,这个下文会演示
syncSend(String destination, Message message, long timeout, int delayLevel)
异步消息(普通、延迟消息):

//发送普通异步消息-Object
asyncSend(String destination, Object payload, SendCallback sendCallback)
//发送普通异步消息-Message
asyncSend(String destination, Message message, SendCallback sendCallback)
//发送普通异步消息-Object,并设置发送超时时间
asyncSend(String destination, Object payload, SendCallback sendCallback, long timeout)
//发送普通异步消息-Message,并设置发送超时时间
asyncSend(String destination, Message message, SendCallback sendCallback, long timeout)
单向(顺序、普通、延迟消息)信息:

//发送单向信息–Message
sendOneWay(String destination, Message message)
//发送单向信息–Object
sendOneWay(String destination, Object payload)
//发送单向顺序信息–Message
public void sendOneWayOrderly(String destination, Message message, String hashKey)
//发送单向顺序信息–Object
public void sendOneWayOrderly(String destination, Object payload, String hashKey)
事务消息:

//发送事务消息

public TransactionSendResult sendMessageInTransaction(String txProducerGroup, String destination, Message message, Object arg)

//取消事务消息

public void removeTransactionMQProducer(String txProducerGroup)

带标签tag消息:

rocketMQTemplate.syncSend(topic+“:”+tag, message)

SQL表达式过滤消息(SQL92过滤):

需要在broker.conf添加enablePropertyFilter=true 支持sql过滤

SQL表达式方式可以根据发送消息时输入的属性进行一些计算。

RocketMQ的SQL表达式语法 只定义了一些基本的语法功能。

数字比较,如>,>=,<,<=,BETWEEN,=;
字符比较,如:=,<>,IN;IS NULL or IS NOT NULL;
逻辑运算符:AND, OR, NOT;
常量类型:
数值,如:123, 3.1415;
字符, 如:‘abc’, 必须使用单引号;
NULL,特殊常量
Boolean, TRUE or FALSE;
String msg = “sql过滤”;
Message message = MessageBuilder.withPayload(msg).build() ;
Map headers = new HashMap<>() ;
headers.put(“i”, 5) ;
rocketMQTemplate.convertAndSend(“test-sql-topic”, message, headers);

注意:

    消息可以指定过滤类型为tag,则 destination传入格式为:topicName:tagName   

四、消费者方法
1.push模式

    消息的生产者将消息发送到broker,然后broker将消息主动推送给订阅了该消息的消费者端。

@Service
@RocketMQMessageListener(consumerGroup = “common-customer-group”, topic = “common_topic”, messageModel = MessageModel.CLUSTERING)
public class CommonConsumerListener implements RocketMQListener {
@Override
public void onMessage(Object o) {
System.out.println(“通用消费者-----------------”+o.toString());
//消费者处理时抛出异常时就会自动重试
throw new RuntimeException(“消费者处理时抛出异常时就会自动重试”);
}
}

@Service
@RocketMQMessageListener(consumerGroup = “common-customer-sql-group”, topic = “common_topic”,selectorType = SelectorType.SQL92 ,selectorExpression = “type=‘user’ or a <7”, messageModel = MessageModel.CLUSTERING)
public class SqlConsumerListener implements RocketMQListener {
@Override
public void onMessage(MessageExt message) {
System.out.println(“消费消息:”+new String(message.getBody()));
System.out.println(“消费消息:”+message.getProperties());
}
}

@Service
@RocketMQMessageListener(consumerGroup = “common-customer-tag-group”, topic = “common_topic”,selectorType = SelectorType.TAG ,selectorExpression = “tagA||tagB”, messageModel = MessageModel.CLUSTERING)
public class TagConsumerListener implements RocketMQListener {
@Override
public void onMessage(Object o) {
System.out.println(o.toString());
}
}

注意:
    消费者监听消息,如果抛出异常,则开启重试。 

selectorType:指定消息通过的tag的方式,默认为SelectorType.TAG
messageModel:指定消息的消费模式,默认为MessageModel.CLUSTERING模式每条消息只能由一个消费者消费,而MessageModel.BROADCASTING模式为广播模式,所有订阅者都能消费。
selectorExpression : 采用rocketMQ支持的表达式,如Tag消息能够被消费,多个采用||分割。SQL消息采用SQL表达式过滤消息。
consumerGroup: 消费组
topic:主题
2.pull模式

    消息生产者将消息发送到broker上,然后由消费者自发的去broker去拉取消息。

五、事务消息
RocketMQ 事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。RocketMQ 的事务消息提供类似 X/Open XA 的分布事务功能,通过事务消息能达到分布式事务的最终一致。 本质是两阶段提交。

1.分布式事务
分布式事务通俗来说,一次操作由若干分支组成,这些分支操作分属于不同的应用,分布在不同的服务器上,分布式事务需要保证这些操作要么全部成功,要么全部失败,分支事务与普通事务一样,就是为了保证操作结果的一致性。

2.事务消息
要么同时成功,要么同时失败。

3.半事务消息
暂存投递的消息,生产者已经成功地将消息发送到了消息队列RocketMQ版服务端,但是消息队列RocketMQ版服务端未收到生产者对消息的二次确认,此时该消息被标记成“暂不能投递”状态,处于该种状态下的消息即半事务消息。

4.消息回查
由于网络闪断、生产者应用重启等原因,导致某条事务消息的二次确认丢失,消息队列RocketMQ版服务端通过扫描发现某条消息长期处于“半事务消息”时,需要主动向消息生产者询问该消息的最终状态(Commit或是Rollback),该询问过程即消息回查。消息事务重试

5.本地事务状态
生产者回调操作执行的结果为本地事务状态。其会发送给事务协调者,而协调者会在发送给事务管理者,事务管理者会根据协调者发送过来的本地事务状态来决定全局事务确认指令。该句话:具体请查看阿里云 Seata 分布式事务。

RocketMQ 的事务消息分为3种状态,分别是提交状态、回滚状态、未知状态。
RocketMQLocalTransactionState.COMMIT: 提交事务,它允许消费者消费此消息。
RocketMQLocalTransactionState.ROLLBACK: 回滚事务,它代表该消息将被删除,不允许被消费。
RocketMQLocalTransactionState.UNKNOWN: 未知状态,它代表需要检查消息队列来确定状态。调用checkLocalTransaction方法,最多重试15次,超过了默认丢弃此消息.

RocketMQ事务消息通过异步确保方式,保证事务的最终一致性。

事务消息发送步骤如下:

生产者将半事务消息发送至消息队列RocketMQ服务端。
消息队列RocketMQ版服务端将消息持久化成功之后,向生产者返回Ack确认消息已经发送成功,此时消息为半事务消息。
生产者开始执行本地事务逻辑。
生产者根据本地事务执行结果向服务端提交二次确认结果(Commit或是Rollback),服务端收到确认结果后处理逻辑如下:
二次确认结果为Commit:服务端将半事务消息标记为可投递,并投递给消费者。
二次确认结果为Rollback:服务端将回滚事务,不会将半事务消息投递给消费者。
在断网或者是生产者应用重启的特殊情况下,若服务端未收到发送者提交的二次确认结果,或服务端收到的二次确认结果为Unknown未知状态,经过固定时间后,服务端将对消息生产者即生产者集群中任一生产者实例发起消息回查。
事务消息回查步骤如下:

生产者收到消息回查后,需要检查对应消息的本地事务执行的最终结果。
生产者根据检查得到的本地事务的最终状态再次提交二次确认,服务端仍按照步骤4对半事务消息进行处理。
回查间隔时间:系统默认每隔30秒发起一次定时任务,对未提交的半事务消息进行回查,共持续12小时。
第一次消息回查最快时间:该参数支持自定义设置。若指定消息未达到设置的最快回查时间前,系统默认每隔30秒一次的回查任务不会检查该消息。
备注:本地事务的回滚依赖于本地DB的ACID特性,订阅方的成功消费由 MQ Server 的失败重试机制进行保证。

六、

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在你的项目中引入 RocketMQ 的相关依赖,例如: ```xml <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>${rocketmq.version}</version> </dependency> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>${rocketmq.spring.boot.version}</version> </dependency> ``` 接着,你需要在 Spring Boot 启动类上添加 @EnableRocketMQ 注解,开启 RocketMQ 的自动配置功能。例如: ```java @SpringBootApplication @EnableRocketMQ public class RocketMQApplication { public static void main(String[] args) { SpringApplication.run(RocketMQApplication.class, args); } } ``` 然后,你需要编写一个消息监听器,实现 RocketMQListener 接口,并实现 onMessage 方法。例如: ```java @Component @RocketMQMessageListener(topic = "test-topic", consumerGroup = "test-group") public class TestListener implements RocketMQListener<String> { @Override public void onMessage(String message) { System.out.println("Received message: " + message); } } ``` 在该示例中,我们定义了一个名为 TestListener 的消息监听器,用于监听名为 test-topic 的主题下的消息。该监听器使用了 @RocketMQMessageListener 注解,指定了消费者组名为 test-group。在 onMessage 方法中,我们只是简单地打印了接收到的消息。 最后,你可以在其他地方发送消息到 test-topic 主题,TestListener 就会自动接收并处理消息。 需要注意的是,RocketMQListener 的类型参数需要与发送消息时的类型参数一致,如果你发送的是 JSON 字符串,则可以使用 RocketMQ 的 JSON 序列化器,将类型参数设置为 com.alibaba.fastjson.JSONObject。如果你需要处理其他类型的消息,可以自定义序列化器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值