网站统计数据,影响网站打开速度,开发公司五一节前安全生产工作部署会,东莞网站制作十强文章目录 RabbitMQ 事务消息概述实现原理代码实现不采用事务采用事务 RabbitMQ 事务消息 概述
RabbitMQ 的 AMQP 协议实现了事务机制#xff0c;允许开发者保证消息的发送和接收时原子性的#xff0c;也就是说#xff0c;要么消息全都发送成功#xff0c;要么全都发送失败… 文章目录 RabbitMQ 事务消息概述实现原理代码实现不采用事务采用事务 RabbitMQ 事务消息 概述
RabbitMQ 的 AMQP 协议实现了事务机制允许开发者保证消息的发送和接收时原子性的也就是说要么消息全都发送成功要么全都发送失败只与发送方有关.
实现原理
AMQP 事务实现类似于传统数据库事务允许在一个事务中发送多条消息并在最后提交或回滚.
事务开始客户端发送 tx.select 方法RabbitMQ 开启一个新的事务上下文.事务内的操作客户端发送消息 basic.publishRabbitMQ 将这些消息暂存在内存中并标记为未提交.事务提交客户端发送 tx.commit 方法RabbitMQ 将所有暂存的消息写入队列并且如果消息标记为持久化那么就把消息保存到磁盘.事务回滚客户端发送 tx.rollback 方法RabbitMQ 丢弃所有暂存的消息不会写入队列.
代码实现
不采用事务
a配置文件
spring:application:name: rabbitmqrabbitmq:host: env-baseport: 5672username: rootpassword: 1111b配置常量
object MQConst {// 事务const val TRANS_QUEUE trans.queue}c定义队列
Configuration
class MQConfig {Beanfun transQueue() Queue(MQConst.TRANS_QUEUE)}d发送接口 两条消息之间故意触发异常.
RestController
RequestMapping(/mq)
class MQApi(val rabbitTemplate: RabbitTemplate,
) {RequestMapping(/trans-close)fun transClose(): String {rabbitTemplate.convertAndSend(, MQConst.TRANS_QUEUE, trans msg 1)//触发异常val a 1 / 0rabbitTemplate.convertAndSend(, MQConst.TRANS_QUEUE, trans msg 1)return ok}}e效果如下 此时队列中只有一条消息说明消息不具备事务特性.
采用事务
a配置两个 Bean
由于事务对整个 RabbitTemplate 都会有影响因此这里重新定义一个 Template bean.还需要配置一个 RabbitMQ事务管理器.
Configuration
class GlobalConfig {Bean(transRabbitTemplate)fun transRabbitTemplate(connectionFactory: ConnectionFactory): RabbitTemplate {val mq RabbitTemplate(connectionFactory)mq.isChannelTransacted true // 开启事务机制return mq}Beanfun rabbitTransactionManager(connectionFactory: ConnectionFactory): RabbitTransactionManager {return RabbitTransactionManager(connectionFactory)}}b如下步骤
使用新定义的事务 mq bean.在方法上加上 Transaction 注解.
RestController
RequestMapping(/mq)
class MQApi(val transRabbitTemplate: RabbitTemplate,
) {TransactionalRequestMapping(/trans-open)fun transOpen(): String {transRabbitTemplate.convertAndSend(, MQConst.TRANS_QUEUE, trans msg 1)//触发异常val a 1 / 0transRabbitTemplate.convertAndSend(, MQConst.TRANS_QUEUE, trans msg 1)return ok}}
c效果演示