Spring Rocketmq 事务消息

文章详细介绍了RocketMQMessageListener的参数,包括消费模式(并发或有序)、消息模型(集群或广播)、选择器表达式用于选择消息,以及消费者组和主题等。在示例代码中,展示了如何配置和使用这些参数来处理消息监听。注意顺序处理不适用于广播模式,因为广播模式无法保证消息顺序一致性。

1、 RocketMQMessageListener参数讲解

@RocketMQMessageListener事务消息监听器

2、参数一 :consumeMode
 

  /**
     *控制消费模式,您可以选择并发或有序接收消息。
     */
    ConsumeMode consumeMode() default ConsumeMode.CONCURRENTLY;
 

3、参数二:messageModel

   

/**
      * 控制消息模式,
      * 广播模式:所有消费者都能接受到消息
      * 集群模式:无论有多少个消费者,只有一个消费者能够接收到消息。
      */
    MessageModel messageModel() default MessageModel.CLUSTERING;

4、参数三:selectorExpression
   

/**
     * 控制可以选择哪个消息
     */
    String selectorExpression() default "*";

     // 同步顺序消息 根据下面使用方式使用即可,在主题上面拼接
    rocketMQTemplate.syncSendOrderly("MQ_TOPIC:user", info);

5、参数四:consumerGroup
   

/**
      *
      *概念:消费者组(多个消费者) 此参数相同即为同一个消费者组
      *作用:集群模式负载均衡的实现,广播模式的通知的实现
      *
      */
    String consumerGroup();

6、参数:topic
   

/**
     * Topic name. 主题
     * 指该消费者组所订阅的消息服务
     * 
     */
    String topic();

7、代码示例

@Service
@RocketMQMessageListener(topic = MQTopicConstants.ZTEITS_RNT_CLOUD,
    selectorExpress = DataCollectionTags.FREE_BERTHS_CHANGE,
    consumeMode = ConsumeMode.BATCH,
    consumerGroup = "${spring.application.name}-" + MQConsumerGroupConstants.UPDATE_FREE_BERTHS_TODB
)
public class UpFreeBerthsMQListener
    implements RocketMQListener<FreeBerthsChangeMsgVO>, AliyunRocketMQPushConsumerLifecycleListener {
    private static final Logger logger = LoggerFactory.getLogger(UpFreeBerthsMQListener.class);
    @Autowired
    private FreeBerthsPushOperService freeBerthsPushOperService;
    @Autowired
    private ParkFreeBerthOperInnerService freeBerthOperInnerService;

    @Autowired
    private DealThirdPushService dealThirdPushService;


    @Override
    public void onMessage(FreeBerthsChangeMsgVO berthsChangeMsgVO) {
        /**********************处理第三方平台进出场推送******************/
        try{
            berthsChangeMsgVO.setSysCode(BasicEnum.SYS_CODE.getValue());
            dealThirdPushService.pushThirdServiceForFreeBerthMsg(berthsChangeMsgVO);
        }catch (Exception e){
            e.printStackTrace();
        }
        /**********************处理第三方平台进出场推送******************/


        try {
            logger.info("==更新空闲车位数到数据库==" + berthsChangeMsgVO.toString());
            freeBerthOperInnerService.updateFreeBerthsNumByPlNo(berthsChangeMsgVO.getPlNo(),
                berthsChangeMsgVO.getFreeBerths(), berthsChangeMsgVO.getRealFreeBerths());
            PushFreeBerthsChangeRequest freeBerthsChangeMsgVO = new PushFreeBerthsChangeRequest();
            freeBerthsChangeMsgVO.setSysCode(BasicEnum.SYS_CODE.getValue());
            List<FreeBerthsChangeMsgVO> berthsChangeMsgVOs = new ArrayList<>();
            berthsChangeMsgVOs.add(berthsChangeMsgVO);
            freeBerthsChangeMsgVO.setBerthsChangeMsgVOs(berthsChangeMsgVOs);
            BizResult<Boolean> bizResult = freeBerthsPushOperService.pushFreeBerthsToScreen(freeBerthsChangeMsgVO);
            if (!ResultUtils.isSuccess(bizResult)) {
                logger.info("诱导推送失败:" + bizResult.getErrMsg());
            }
        } catch (Exception e) {
            logger.error("更新空闲车位数到数据库失败", e);
        }
    }

    @Override
    public void prepareStart(Properties properties) {
        //设置该消费者一次批量消费条数
        properties.put(PropertyKeyConst.ConsumeMessageBatchMaxSize, 24);

    }
}

注意:顺序处理不能和广播模式同时使用,应该广播模式是属于并发的,而顺序是强调FIFO原则,广播模式不能保证顺序一致性。

原文链接:https://blog.youkuaiyun.com/weixin_51442090/article/details/128659127

<think>好的,用户想了解Spring框架中RocketMQ消息转换机制。首先,我需要回忆一下之前学过的相关知识,尤其是关于Spring Messaging模块和RocketMQ整合的内容。记得用户提供的引用中提到RocketMQMessageHandler会构造RocketMQTemplate,并将spring的Message转换为RocketMQ的Message。 首先,我应该从消息转换的基本流程开始。可能需要解释Spring Messaging的Message和RocketMQ的Message结构差异,然后说明转换的步骤。比如,消息头是如何处理的,消息体又是怎么转换的。这里要提到MessageConverter接口,以及默认实现,可能还有用户自定义转换器的部分。 然后,需要引用用户提供的参考内容,特别是引用1和引用4中的内容。引用1提到了RocketMQTemplate内部转换消息的过程,而引用4中的代码示例展示了事务消息的处理,可能涉及到消息属性的设置,比如Topic和QueueId的变更。这些可以作为具体实现的例子来说明。 接下来,应该分步骤详细说明转换机制。可能包括消息头的映射,比如用户属性如何变成RocketMQ的properties,系统头信息的处理,比如延迟级别。还要提到消息体的序列化方式,比如JSON或者字节数组,以及如何通过MessageConverter进行配置。 另外,用户可能关心如何自定义消息转换,这部分需要说明如何扩展MessageConverter,并注册到Spring容器中。比如,添加FastJson或Protobuf的支持,这里可以举例子说明配置方法。 需要注意文档中的实现类,比如TransactionalMessageServiceImpl中的asyncPrepareMessage方法,将消息的Topic设置为半消息Topic,并存储到CommitLog。这说明在事务消息处理中,消息转换不仅仅是格式转换,还包括属性的修改和存储逻辑的变化。 最后,总结整个转换机制的关键点,并确保引用了正确的参考文献。同时,根据用户提供的示例,生成相关的问题,比如性能优化、事务消息处理或者自定义序列化方法。这些问题需要与转换机制紧密相关,帮助用户进一步深入理解。 现在需要检查是否有遗漏的部分,比如消息转换过程中的异常处理,或者不同消息类型(如顺序消息事务消息)的转换差异。此外,确保所有技术术语使用正确,如RocketMQTemplate、MessageConverter等,并且符合用户提供的引用内容。</think>### Spring框架中RocketMQ消息转换机制实现方式 #### 一、核心实现流程 1. **消息封装阶段** Spring应用通过`RocketMQTemplate`发送消息时,会使用`org.springframework.messaging.Message`封装消息头和消息体[^1]。例如: ```java Message<String> springMsg = MessageBuilder.withPayload("Hello") .setHeader("TAGS", "demo").build(); ``` 2. **消息转换阶段** `RocketMQTemplate`调用`RocketMQMessageConverter`进行消息转换,关键步骤如下: - **消息头映射**:将Spring Message头转换为RocketMQ Message的`properties`字段 $$properties.put("TAGS", "demo")$$ - **系统头处理**:特殊头信息(如`DELAY`、`KEYS`)会直接设置到RocketMQ Message的对应属性 - **消息体序列化**:默认使用`MappingRocketMQMessageConverter`进行JSON序列化 3. **RocketMQ消息构造** 最终生成`org.apache.rocketmq.common.message.Message`对象: ```java rocketMsg.setTopic("TEST_TOPIC"); rocketMsg.setBody(JSON.toJSONBytes(springMsg.getPayload())); ``` #### 二、关键实现类解析 | 类名 | 职责说明 | 参考代码片段 | |-----------------------------|-----------------------------------|----------------------------------------------------------------------------| | `RocketMQMessageHandler` | 消息处理器入口 | `基于Binding配置构造RocketMQTemplate`[^1] | | `TransactionalMessageServiceImpl` | 事务消息处理 | `message.setTopic(TopicValidator.RMQ_SYS_TRANS_HALF_TOPIC)`[^4] | | `MessageConverter` | 消息格式转换接口 | 支持JSON/byte[]等序列化方式 | #### 三、自定义配置方法 1. **修改序列化方式** 通过配置`RocketMQMessageConverter`实现: ```java @Bean public MessageConverter customConverter() { return new FastJsonRocketMQMessageConverter(); } ``` 2. **扩展消息头映射** 继承`DefaultRocketMQHeaderMapper`类: ```java public class CustomHeaderMapper extends DefaultRocketMQHeaderMapper { @Override public void fromHeaders(...) { // 添加自定义头处理逻辑 } } ``` #### 四、事务消息特殊处理 在事务消息场景下,消息转换会增加特殊标记: $$message.setProperty("TRAN_MSG", "true")$$ 并通过`TransactionalMessageServiceImpl`将消息暂存到半消息Topic[^4]: ```java // 引用自事务消息处理器 message.setTopic(RMQ_SYS_TRANS_HALF_TOPIC); message.setQueueId(0); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值