直接上代码
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层调用
@Override
public void insertMessageTemplate(MessageTemplate messageTemplate) {
messageTemplate.setCreateTime(LocalDateTime.now());
messageTemplate.setUpdateTime(LocalDateTime.now());
messageTemplateMapper.insert(messageTemplate);
//rocketmq服务中事先应该存在该发送消息的topic
//这里的s其实就是TopicConstant.TEMPLATE_CHANGE_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()));
// }
// });
}
service层 需要由Transactional注解修饰 事务才可奏效
@Override
@Transactional(rollbackFor = Exception.class)
public void addMessageTemplate(AddMessageTemplateRequest request, Boolean enable) {
messageTemplateDao.insertMessageTemplate(messageTemplateEntity);
}
这里用到了Consumer 函数式接口,大家有时间可以了解一下。
这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!!!