RocketMQ事务消息

Message<String> msg = MessageBuilder
		.<String>withPayload(user.getName())
		.setHeader(RocketMQHeaders.TRANSACTION_ID,UUID.randomUUID().toString())
		.build();
		TransactionSendResult sendResult = rocketMQTemplate.sendMessageInTransaction(destination,msg, user);
		LocalTransactionState localTransactionState = sendResult.getLocalTransactionState();
		logger.info("发送状态:localTransactionState==>{}",localTransactionState);
@RocketMQTransactionListener
public class UserTransactionListener implements RocketMQLocalTransactionListener {

	static final Logger logger = LoggerFactory.getLogger(UserTransactionListener.class);
	@Autowired
	private MongoTemplate mongoTemplate;
	
	
	/***
	 * 发送prepare消息成功此方法被回调,该方法用于执行本地事务
	 * @param msg 回传的消息,利用transactionId即可获取到该消息的唯一Id 
	 * @param arg 调用send方法时传递的参数,当send时候若有额外的参数可以传递到send方法中,这里能获取到 - 
	 * @return    返回事务状态,COMMIT:提交 ROLLBACK:回滚 UNKNOW:回调
	 */
	@SuppressWarnings("rawtypes")
	@Override
	public RocketMQLocalTransactionState executeLocalTransaction(final Message msg, Object arg) {
		logger.info("prepare消息成功此方法被回调===== message:{},{}",msg,JSON.toJSONString(arg));
		MessageHeaders headers = msg.getHeaders();
		String TRANSACTION_ID = headers.get("TRANSACTION_ID").toString();
		try {
			mongoTemplate.insert(arg);
			String payload = new String((byte[]) msg.getPayload(),"utf-8");
			logger.info("TRANSACTION_ID:{}, payload:{}",TRANSACTION_ID,payload);
		} catch (Exception e) {
			logger.error("执行本地事务异常:messageId:{}",TRANSACTION_ID,e);
			return RocketMQLocalTransactionState.ROLLBACK;
		}
		return RocketMQLocalTransactionState.COMMIT;
	}

	/***
	 *@param msg 通过获取transactionId来判断这条消息的本地事务执行状态
	 *@return 返回事务状态,COMMIT:提交 ROLLBACK:回滚 UNKNOW:回调
	 */
	@SuppressWarnings("rawtypes")
	@Override
	public RocketMQLocalTransactionState checkLocalTransaction(final Message msg) {
		String TRANSACTION_ID = msg.getHeaders().get("TRANSACTION_ID").toString();
		logger.info("====检查事务状态,TRANSACTION_ID:{}",TRANSACTION_ID);
		//由于RocketMQ迟迟没有收到消息的确认消息,因此主动询问这条prepare消息,是否正常?可以查询数据库看这条数据是否已经处理
		return RocketMQLocalTransactionState.COMMIT;// 检查事务状态并返回bollback、commit或unknown
	}

}

@RocketMQMessageListener(topic = MsgConst.USER_TOPIC, consumerGroup = MsgConst.CONSUMER_GROUP)
public class UserConsumer implements RocketMQListener<MessageExt>{
	
	static final Logger logger = LoggerFactory.getLogger(UserConsumer.class);

	@Override
	public void onMessage(MessageExt message) {
		String msg = null;
		try {
			msg = new String(message.getBody(), "utf-8");
			logger.info("消费 msg:{}, msgId:{}", msg, message.getMsgId());
		} catch (Exception e) {
			logger.error("消费异常", e);
		}

	}
	
	

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值