目录
一、简介
在之前的文章中,我讲过了发送事务消息,好像是通过RocketMQTemplate就完成了普通消息和事务消息的发送,有小伙伴就会问,如果一个系统可能不止一个事务,都会进入到同一个监听啊,有什么办法处理么?也就是多事务发送消息。主要是两种方式:
- 自己在发生消息的时候在头部添加区分业务的属性,然后在监听器取出来,然后做不同的业务
- 每个事务都配置单独的事务监听器(本文的方式)
二、Maven依赖
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>rocketmq</artifactId>
<groupId>com.alian</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>06-send-transactional-message</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alian</groupId>
<artifactId>common-rocketmq-dto</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
父工程已经在我上一篇文章里,通用公共包也在我上一篇文章里有说明,包括消费者。具体参考:RocketMQ笔记(一)SpringBoot整合RocketMQ发送同步消息
三、生产者
在本文中假设有两个事务,员工消息和订单消息需要事务处理。
3.1、application配置
application.properties
server.port=8006
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type= com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=test
spring.datasource.password=Alian!@34
spring.datasource.url=jdbc:mysql://192.168.0.139:3306/test?characterEncoding=utf8&useUnicode=true&useSSL=false&zeroDateTimeBehavior=convertToNull&autoReconnect=true&allowMultiQueries=true&failOverReadOnly=false&connectTimeout=6000&maxReconnects=5
spring.datasource.initialSize=5
spring.datasource.minIdle= 5
spring.datasource.maxActive=20
# rocketmq地址
rocketmq.name-server=192.168.0.234:9876
# 默认的生产者组
rocketmq.producer.group=transactional_group
# 发送同步消息超时时间
rocketmq.producer.send-message-timeout=3000
# 用于设置在消息发送失败后,生产者是否尝试切换到下一个服务器。设置为 true 表示启用,在发送失败时尝试切换到下一个服务器
rocketmq.producer.retry-next-server=true
# 用于指定消息发送失败时的重试次数
rocketmq.producer.retry-times-when-send-failed=3
# 设置消息压缩的阈值,为0表示禁用消息体的压缩
rocketmq.producer.compress-message-body-threshold=0
3.2、数据库
我们这里准备两个表,员工表 和 订单表用于测试。
员工表
CREATE TABLE `employee` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`code` varchar(30) NOT NULL DEFAULT '' COMMENT '编号',
`emp_name` varchar(20) NOT NULL DEFAULT '' COMMENT '姓名',
`age` int(2) NOT NULL DEFAULT '0' COMMENT '年龄',
`salary` double(8,2) NOT NULL DEFAULT '0.00' COMMENT '工资',
`department` varchar(20) NOT NULL DEFAULT '' COMMENT '部门',
`hire_date`