# Transactional-Spring-Boot-Starter **Repository Path**: brabbit/transactional-spring-boot-starter ## Basic Information - **Project Name**: Transactional-Spring-Boot-Starter - **Description**: 基于rocketMQ的分布式事务解决方案 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-09 - **Last Updated**: 2023-08-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 分布式事务 v2.0.0 -依赖mysql的版本 注: (1)必须使用jdk1.8或jdk1.8以上版本 (2)必须依赖于SpringBoot (3)必须依赖于mysql * 本版本依赖于mysql可解决v1.0.0版本中因服务宕机导致的redis不能写入的问题 * 增加配置db-name,需要指定数据库名称 * 本版本取消使用tag区分不同事务,只允许使用topicName区分事务 * 不支持在同一项目里监听调用多个同一名称的topicName,topicName和id只代表一个事务的生命周期 引用 ```java com.yinuo yinuo-spring-boot-starter-transactional 2.0.0 ``` ```yaml yinuo: translation:  # ROCKETMQ地址,可配置多个实现高可用配置 name-srv-addr: - 47.103.36.84:9876 db-name: service_report_db # 数据库名称 producer: # 生产者配置 enabled: true # 开关 send-msg-timeout: 3000 # 消息发送超时时间 retry-times-when-send-async-failed: 2 # 异步发送消息,发送失败的重试次数 retry-another-broker-when-not-store-ok: true # 同步发送消息,消息存储失败是否重试其他broker group-name: producer-group # Producer组名,相同分组的producer应该有相同的发送消息逻辑 max-message-size: 4194304 # 客户端限制消息的大小,默认4M consumer: # 消费者配置 group-name: consumer-group consume-message-batch-max-size: 10 # 批量消费,一次消费多少条消息 max-reconsume-times: 10 # 消费重试次数(默认16) ``` #### 传递消息体 TransactionalMessage ```java public class TransactionalMessage implements Serializable { private String topicName; // topic private String id; // 消息唯一ID(必须设置) private Object data; // 给消费者传递的参数 } ``` #### producer 生产者 ```java @TransactionalProducer private void save(TransactionalMessage transactionalMessage){ // 生产者事务方法 } ``` 1.事务消息的topicName不能自动创建,需要自己手动创建,使用的topicName区分不同的事务场景! 2.方法体第一个参数请务必使用TransactionalMessage封装类,此消息将进行传递 3.TransactionalMessage消息体内的id必须指定,用于区分不同生命周期的事务,请保证每次触发事务使用不同ID(推荐使用UUID) 4.Spring事务传播方式必须使用PROPAGATION_REQUIRED,以便切点外部控制该事务 #### consumer 消费者 ```java @TransactionalConsumer(topicName = "testtopic") public Integer save2(TransactionalMessage transactionalMessage) { System.out.println("消费者事务!"); return ResultBase.CONSUMER_FAIL; } ``` 1.方法体第一个参数请务必使用TransactionalMessage封装类,此参数作为生产者传递的接收参数 2.关于消费者手动控制MQ消费状态 返回值 (1)ResultBase.CONSUMER_SUCCESS; 消费成功 (2)ResultBase.CONSUMER_FAIL 消费失败 (将重试消费) * 关于消费失败,允许根据业务结果产生消费失败,不允许将消费失败作为固定返回值