Spring Transaction Annotations - 在成功时执行

Dre*_*ter 12 spring transactions

我在服务层中使用Spring应用程序事件,以便在特定事件发生时通知更广泛的系统.我遇到的问题是事件是在事务上下文中触发的(我使用的是Spring的@Transactional注释).危险在于我触发事件然后事务在提交时失败(例如,在使用Hibernate时可能发生).在这种情况下,事件侦听器将假设某些状态,然后在执行后将回滚.这里的危险是,例如,我可能发送了一封电子邮件,以确认用户在网站上的注册,实际上,他们的用户帐户实际上并未创建.

是否有一种方法,保留注释的使用,标记事件提交后要触发的事件?它似乎有点类似于SwingUtilities.invokeLater(Runnable runnable)在Java Swing中进行GUI编程时的使用.我想说,一旦当前事务成功提交,稍后执行这段代码.

有任何想法吗?

谢谢,

安德鲁

Oli*_*liv 12

这对我有用:

TransactionSynchronizationManager.registerSynchronization(
    new TransactionSynchronizationAdapter() {
        @Override
        public void afterCommit() {
            // things to do when commited
        }
        // other methods to override are available too
    });
Run Code Online (Sandbox Code Playgroud)


axt*_*avt 2

解决确认电子邮件问题的正确方法可能是使用分布式事务以及参与其中的 JMS 资源。

然而,作为一个快速而肮脏的解决方案,您可以尝试创建一个围绕 a 的包装器PlatformTransactionManager,它将在成功提交后执行Runnable在某些存储中注册的 s ThreadLocal(并ThreadLocal在回滚后将其从其中删除)。实际上, sAbstractPlatformTransactionManager确实有这种逻辑TransactionSynchronization,但它的实现细节埋藏得太深了。