Code directly
import java.util.function.Consumer;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
@Component
public class TransactionCommitHandler {
public void handle(String topic, Consumer<String> consumer) {
if (TransactionSynchronizationManager.isActualTransactionActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
//具体的操作
consumer.accept(topic);
}
});
}
}
}
dao layer call
@Override
public void insertMessageTemplate(MessageTemplate messageTemplate) {
messageTemplate.setCreateTime(LocalDateTime.now());
messageTemplate.setUpdateTime(LocalDateTime.now());
messageTemplateMapper.insert(messageTemplate);
//rocketmq服务中事先应该存在该发送消息的topic
transactionCommitHandler.handle(TopicConstant.TEMPLATE_CHANGE_TOPIC, s -> rocketMQTemplate
.send(TopicConstant.TEMPLATE_CHANGE_TOPIC, MessageBuilder.withPayload("topic发生变化").build()));
// transactionCommitHandler.handle(TopicConstant.TEMPLATE_CHANGE_TOPIC, new Consumer<String>() {
// @Override
// public void accept(String s) {
// rocketMQTemplate.send(TopicConstant.TEMPLATE_CHANGE_TOPIC,
// MessageBuilder.withPayload("topic发生变化").build()));
// }
// });
}
The service layer needs to be modified by Transactional annotations to be effective
@Override
@Transactional(rollbackFor = Exception.class)
public void addMessageTemplate(AddMessageTemplateRequest request, Boolean enable) {
messageTemplateDao.insertMessageTemplate(messageTemplateEntity);
}
Consumer functional interface is used here, you can find out if you have time.
Persistence or non-persistence in this life is not terrible. What I am afraid of is walking on the road of persistence alone! ! !