producer
使用事务消息,需要事务生产者类,线程池是为了处理broker的回查事务状态的处理的。事务监听器主要是用来执行本地事务,当事务消息发送成功后,执行本地事务,然后在判断是否提交回滚事务消息。还有就是当broker回查时检查本地事务状态的作用。
TransactionListener transactionListener = new TransactionListenerImpl();
TransactionMQProducer producer = new TransactionMQProducer("please_rename_unique_group_name");
ExecutorService executorService = new ThreadPoolExecutor(2, 5, 100, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2000), new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("client-transaction-msg-check-thread");
return thread;
}
});
producer.setExecutorService(executorService);
producer.setTransactionListener(transactionListener);
producer.start();
启动时会检查事务的线程池配置信息。
public void initTransactionEnv() {
TransactionMQProducer producer = (TransactionMQProducer) this.defaultMQProducer;
if (producer.getExecutorService() != null) {
this.checkExecutor = producer.getExecutorService();
} else {
this.checkRequestQueue = new LinkedBlockingQueue<Runnable>(producer.getCheckRequestHoldMax());
this.checkExecutor = new ThreadPoolExecutor(
producer.getCheckThreadPoolMinSize(),
producer.getCheckThreadPoolMaxSize(),
1000 * 60,
TimeUnit.MILLISECONDS,
this.checkRequestQueue);
}
}
broker
初始化时会创建事务消息的一些服务。TransactionalMessageServiceImpl事务消息的主要处理类,TransactionalMessageBridge事务消息的存储桥接类,DefaultTransactionalMessageCheckListener事务消息检查监听类,主要向producer发送检查事务状态的消息,TransactionalMessageCheckService事务消息检查线程,调用TransactionalMessageServiceImpl来达到事务消息的检查作用。
private void initialTransaction() {
this.transactionalMessageService = ServiceProvider.loadClass(ServiceProvider.TRANSACTION_SERVICE_ID, TransactionalMessageService.class);
if (null == this.transactionalMessageService) {
this.transactionalMessageService = new TransactionalMessageServiceImpl(new TransactionalMessageBridge(this, this.getMessageStore()));
log.warn("Load default transaction message hook service: {}", TransactionalMessageServiceImpl.class.get