JmsMessagingTemplate发送消息添加事务是非常简单的,只需要在你要添加事务的类上添加注解@Transactional
,没错就是和普通添加事务一样,但是注意下,你的activeMQ的config配置文件中一定要添加Jms事务管理器否则事务是不生效的。
1、activeMQ中config中添加JMS事务管理器如下图所示:
@Component
@EnableJms
public class ActiveConfig {
@Bean
public Queue queue() {
// 将该队列装在到Spring容器
return new ActiveMQQueue("TEST");
}
/**
* 添加Jms事务管理器
*/
@Bean
public PlatformTransactionManager createTransactionManager(ConnectionFactory connectionFactory) {
return new JmsTransactionManager(connectionFactory);
}
}
2、类中添加事务注解代码如下所示:
@Transactional
public SingleResponse<OrderDTO> addOrder(OrderAddDTO orderAddDTO) throws JMSException {
//保证幂等性
String key = "order:addOrderSubmitNo:" + orderAddDTO.getSubmitNo();
String value = RandomUtils.number(8);
Boolean isSubmit = redisTemplate.opsForValue().setIfAbsent(key, value, 10, TimeUnit.MINUTES);
if (!isSubmit) {
return SingleResponse.buildFailure("error", "该笔订单已经提交,禁止再次提交!");
}
String orderSn = "orderSn_" + SequenceUtil.getSequence();
//在order表中增加数据
OrderDO orderDO = this.insertOrder(orderSn, orderAddDTO);
Long orderId = orderDO.getId();
//将消息传递给MQ
//传统的发送至消息队列
//this.sendMQ(orderAddDTO, orderSn, orderDO);
this.sendPoolMQ(orderAddDTO, orderSn, orderDO);
//在orderItem中增加数据
this.addOrderItem(orderId, orderSn, orderAddDTO);
OrderDTO orderDTO = new OrderDTO();
BeanUtils.copyProperties(orderDO, orderDTO);
return SingleResponse.of(orderDTO);
}
private void sendPoolMQ(OrderAddDTO orderAddDTO, String orderSn, OrderDO orderDO) throws JMSException {
ActiveMQMapMessage activeMQMapMessage = new ActiveMQMapMessage();
activeMQMapMessage.setString("order_sn", orderSn);
activeMQMapMessage.setString("order_id", String.valueOf(orderDO.getId()));
jmsMessagingTemplate.convertAndSend("POOL_ORDER_ADD_ORDER_QUEUE", activeMQMapMessage);
}
好了,添加事务控制就是那么简单,希望能帮到大家。