本文为记录贴,为了防止我自己忘记了,rocketMq功能有需要的自行百度不做详细介绍。
1. TransactionListener
事务监听器用于执行需要执行事务的Service实现。和监听事务回执
1. LocalTransactionState executeLocalTransaction(final Message msg, final Object arg);
这个方法用于执行事务的Service实现。
返回类型
LocalTransactionState
COMMIT_MESSAGE
:执行成功交半消息变成完整消息让消费者消费
ROLLBACK_MESSAGE
:执行失败将半消息删除
UNKNOW
:未知状态,不清楚是否执行成功或者失败。
2. LocalTransactionState checkLocalTransaction(MessageExt messageExt)
这个方法用于执行事务回执,当执行事务方法长时间没有返回执行这个方法回查事务(查询数据库)
/**
* @author:
* @date: 2021/1/12 10:46
*/
@Slf4j
public class PointTransactionListener implements TransactionListener {
private TransactionService transactionService;
public PointTransactionListener(TransactionService transactionService){
this.transactionService = transactionService;
}
/**
* 当send transactional prepare(half)消息成功时,将调用此方法来执行本地事务。
* @param message 一半的消息
* @param o 自定义业务参数
* @return 事务状态
*/
@Override
public LocalTransactionState executeLocalTransaction(Message message, Object o) {
try {
if (transactionService == null){
throw new BusinessImplNullException("事务业务实现类不能为空");
}
transactionService.sendTransaction(message.getTransactionId());
return LocalTransactionState.COMMIT_MESSAGE;
}catch (BusinessImplNullException e){
return LocalTransactionState.ROLLBACK_MESSAGE;
}catch (Exception e){
return LocalTransactionState.ROLLBACK_MESSAGE;
}
}
@Override
public LocalTransactionState checkLocalTransaction(MessageExt messageExt){
/**
* 查询数据库此消息是否已处理
*
*/
if (transactionService.transactionCallBack(messageExt.getTransactionId())){
return LocalTransactionState.COMMIT_MESSAGE;
}
return LocalTransactionState.UNKNOW;
}
}
TransactionMQProducer
事务发送者:rocketMq事务发送类
/**
* 事务发送生产者
* @author: hw
* @date: 2021/3/8 16:06
*/
@Slf4j
@Configuration
public class TransactionConfig implements RocketProducer, ServiceDispatch{
@Autowired private JmsProperties jmsProperties;
private TransactionService transactionService;
@Override
public SendResult transactionSend(TransactionDto transactionDto){
// 事务创建者组
TransactionMQProducer producer = new TransactionMQProducer(jmsProperties.getProducerGroup());
// 添加服务器地址
producer.setNamesrvAddr(jmsProperties.getServerAddr());
// 添加事务监听器
producer.setTransactionListener(new PointTransactionListener(transactionService));
/**
* 自定义线程池来处理检查请求
*/
ExecutorService executorService = new ThreadPoolExecutor(
2,
5,
100,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(2000), new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("RocketMq事务检查线程:"+thread.getName());
return thread;
}
});
// 添加自定义线程池
producer.setExecutorService(executorService);
try {
producer.start();
/**
* 封装消息对象
*/
Message message = new Message(transactionDto.getTopic(), transactionDto.getTag(),transactionDto.getMessageBody().getBytes());
/**
* 发送半消息体
*/
SendResult sendResult = producer.sendMessageInTransaction(message,null);
producer.shutdown();
log.info("{}, {}", sendResult.getSendStatus(), sendResult.toString());
return sendResult;
} catch (MQClientException e) {
e.printStackTrace();
}
return null;
}
@Override
public TransactionService setTransactionService(TransactionService transactionService) {
return this.transactionService = transactionService;
}