@Componentpublic class MqProducer {private DefaultMQProducer producer;//为了保证MQ发送一定成功所以需要使用rocketmq中的事务private TransactionMQProducer transactionMQProducer;@Value("${mq.nameserver.addr}")private String nameAddr;@Value("${mq.topicname}")private String topicName;@Resourceprivate OrderService orderService;@Resourceprivate StockLogDOMapper stockLogDOMapper;@PostConstructpublic void init() throws MQClientException {//做mq producer的初始化producer = new DefaultMQProducer("producer_group");producer.setNamesrvAddr(nameAddr);producer.start();transactionMQProducer = new TransactionMQProducer("transaction_producer_group");transactionMQProducer.setNamesrvAddr(nameAddr);transactionMQProducer.start();transactionMQProducer.setTransactionListener(new TransactionListener() {@Overridepublic LocalTransactionState executeLocalTransaction(Message message, Object arg) {//真正要做的事情,就是创建订单这步就是MQ事务中本地事务部分Integer itemId = (Integer) ((Map)arg).get("itemId");Integer promoId = (Integer) ((Map)arg).get("promoId");Integer userId = (Integer) ((Map)arg).get("userId");Integer amount = (Integer) ((Map)arg).get("amount");String stockLogId = (String) ((Map)arg).get("stockLogId");try {orderService.createOrder(userId,itemId,promoId,amount,stockLogId);} catch (BusinessException e) {e.printStackTrace();//设置对应的stockLog为回滚状态StockLogDO stockLogDO = stockLogDOMapper.selectByPrimaryKey(stockLogId);stockLogDO.setStatus(3);stockLogDOMapper.updateByPrimaryKeySelective(stockLogDO);return LocalTransactionState.ROLLBACK_MESSAGE;}return LocalTransactionState.COMMIT_MESSAGE;}/*** 假设在创建订单createOrder这个过程发生了很长的时间,创建订单在数据库压力比较大的情况下可能用了* 10s多 。这样MQ就发现本地事务一直没有说提交成功还是提交失败回滚,处于一个UNKNOW的状态* 于是就需要checkLocalTransaction回调判断是否下单是否是成功的*/@Overridepublic LocalTransactionState checkLocalTransaction(MessageExt msg) {//根据是否扣减库存成功,来判断要返回COMMIT,ROLLBACK还是继续UNKNOWNString jsonString= new String(msg.getBody());Map
- 2023华为产品测评官活动火热开启——发出属于你的开发者之声,赢取丰厚奖品!
- 51cto首次户外纪实
- 跑步准备活动
- 转载 UCenter Home如何做线下活动
- 9月流量扶持活动入选名单出来啦!
- 三国中的名将颜良为何会被关羽秒杀?
- 美容店通过什么活动能最快吸引顾客?
- 企业私域流量活动参与率怎么提高?
- 受众同步管理功能上线,让你的活动礼包发对人
- 实用干货 高中数学,高考压轴三角形难题秒杀技巧