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);
}
}
}