springboot 事务之后进行其他操作

直接上代码

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
        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 函数式接口,大家有时间可以了解一下。

这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!!!

猜你喜欢

转载自blog.csdn.net/taiguolaotu/article/details/113574266