当前项目MySQL
版本为5. 7,为了方便搭建环境,采用 Docker
安装。
docker run --name mysql -d -p 3306:3306 \
-v yourPath:/var/lib/mysql \
-v yourPath:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=yourPassword \
mysql:5.7
数据库表请看项目中的 order_log.sql
。
RabbitMQ
的 Docker 镜像为 3-management,带有 Web 界面的控制台。
默认端口 5672,web控制台端口 15672。
docker run -d \
--name rabbimtmq -p 5672:5672 \
-p 15672:15672 \
rabbitmq:3-management
Redis
用来解决消息重复消费的问题,默认端口6379。
docker run -p 6397:6379 --name redis \
-d redis:6.0.5 redis-server /etc/redis/redis.conf
- JDK 1.8
- Maven 3.5
- IntelliJ IDEA (注意:务必使用 IDEA 开发,同时保证安装
lombok
插件)
该项目中包含两个子项目order-entity
和 order-producer
order-entity
:封装了实体类,导入一些工具包。order-producer
:主要业务逻辑,Controller、Service、定时任务等,并且依赖order-entity
。order-consumer
:消费端,使用Redis避免消息的重复消费。
config
:该包下是 RabbitMQ 的配置,包括声明交换机、队列、绑定关系和消息的转换。constant
:该包定义常量,用于方便描述消息的投递状态。controller
:定义了一个接口/order
,在浏览器/postman 中调用该接口可创建订单。mapper
:定义了操作数据库的方法。producer
:消息投递和消息确认模板。service
:具体业务逻辑。task
:定时任务。
step1
:订单和日志记录全部入库(消息日志入库的初始投递状态为0,表示正在投递)。step2
:向 Broker 投递消息。step3
:发送端监听 Broker 的确认。step4
:如果发送端监听确认消息为ACK,表示Broker成功收到消息,将日志记录中的消息投递状态更改为1(1代表消息投递成功)。step5、step6
:定时任务抓取超时消息(status = 0,并且投递时间大于1分钟即为超时消息),如果重投次数 >= 3就标记为投递失败(投递状态更改为2),反之重新投递。
# 下载项目到本地
git clone https://github.com/RingoTangs/spring-boot-rabbitmq-delivery.git
# 使用Maven打开该项目下载依赖
# 配置application.yaml中的环境
# 先启动生产端, 再启动消费端, 访问 /order接口,观察 MySQL 和 RabbitMQ消息记录即可!