seata事务或本地事务,完成commit后,发送kafka消息;如果事务回滚,不发送消息。
方法可以加@Transactional本地事务注解,也可以加@GlobalTransactional全局事务注解。
发送消息的类:
java
@Service
public class MessageSendAfterCommit {
@Autowired
ApplicationEventPublisher eventPublisher;
@Autowired
private MessageQueueService messageQueueService;
public void send(String message) {
GlobalTransaction globalTransaction = GlobalTransactionContext.getCurrent();
if(!isSeataTransaction()) {
// 不是seata事务
eventPublisher.publishEvent(message);
} else {
// seata事务
MessageTransactionHook messageTransactionHook = new MessageTransactionHook(message);
TransactionHookManager.registerHook(messageTransactionHook);
}
}
private boolean isSeataTransaction() {
return StrUtil.isNotBlank(RootContext.getXID());
}
class MessageTransactionHook extends TransactionHookAdapter {
private String messageContent;
public MessageTransactionHook(String message) {
this.messageContent = message;
}
@Override
public void afterCommit() {
System.out.println("This is Kevin");
// 这里发送消息。
}
}
}
如果是本地事务,需要发送spring事件,由监听器监听后发消息:
java
@Component
public class TransactionEventListeners {
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void kevinTestInfoReq(String req) {
System.out.println("kevin Zhang Transaction");
// 发送消息。
}
}