如何始终拦截Spring 4.x事务

时间:2017-11-07 18:22:32

标签: java spring spring-data

我们正在使用Spring 4.x,Hibernate 5.x,Spring-Data 1.11,我们目前有一个扩展org.hiberate.EmptyInterceptor的SQL拦截器,我们基本上在Web开始时手动将其挂起使用HibernateInterceptor.setInterceptor请求。我们还有通过Spring任务调度程序在后台运行的作业。这些开始他们自己的交易,显然没有附加到他们的拦截器。我现在要做的就是找到一种在所有情况下拦截Spring的@Transactional的方法。

我已经查看了TransactionInterceptor@TransactionalEventListener,到目前为止还没有让它们中的任何一个工作,而且很难弄清楚目前的情况被认为是Spring的最佳实践。

基本上我们试图解决的问题是,如果失败或成功,我们需要知道交易的结束。

那么Spring目前的最佳做法是什么,总是得到前/后提交事件,以便我们可以根据需要做出响应?

修改

意识到@TransactionalEventListener不会起作用,因为我们没有使用Spring事件,所以这只是对我真正做了什么的误解。

1 个答案:

答案 0 :(得分:2)

你能做到的一种方法是创建一个简单的方面,例如:

@Aspect
@Component
public class AfterTransactionalAspect {

    @After("@annotation(Transactional)")
    public void cleanupAfterTransaction(JoinPoint joinPoint) throws Throwable {  
        // ... Do cleanup work here
    }

另一个好方法(如果你使用的是Spring-destined事件)就是使用@TransactionalEventListener

您确定使用ApplicationEventPublisher发布活动吗?您确定在配置上@EnableTransactionManagement@TransactionalEventListener是公共方法,设置了TransactionTemplate,在发布事件发生的方法上使用@Transactional吗?