错误:无法使用 spring 任务执行器获取当前线程的事务同步会话

Posted

技术标签:

【中文标题】错误:无法使用 spring 任务执行器获取当前线程的事务同步会话【英文标题】:Error: Could not obtain transaction-synchronized Session for current thread with spring task executor 【发布时间】:2016-02-19 19:02:14 【问题描述】:

我正在写一个帖子服务,记录我的活动,因为它是活动服务,它每秒调用 10 次,所以我必须通过异步执行来控制它,所以我选择了 spring 任务执行器,我正在使用 spring 事务经理获取会话,但如果我从任务执行程序运行方法调用,我会收到以下异常。

线程“executorWithPoolSizeRange-1”org.hibernate.HibernateException 中的异常:无法获取当前线程的事务同步会话

你可以查看我的代码

public void saveActivityLogs(final List<UserActivityEntity> activityLogs,final String clientIP,final int clientPort)
    logger.info("Saving activiytlogs");
    /*for(UserActivityEntity activitylog:activityLogs)
        activitylog.setClientIp(clientIP);
        activitylog.setClientPort(clientPort);
        this.commonDAO.saveActivityLogs(activitylog);
       */
    executorWithPoolSizeRange.execute(new Runnable() 
        public void run() 
            addActivityLogs(activityLogs,clientIP,clientPort);
           
    );

/**
    this method will call from above one 
 */
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void addActivityLogs(List<UserActivityEntity> activityLogs,String clientIP,int clientPort)
    for(UserActivityEntity activitylog:activityLogs)
        activitylog.setClientIp(clientIP);
        activitylog.setClientPort(clientPort);
        this.commonDAO.saveActivityLogs(activitylog);
       


【问题讨论】:

【参考方案1】:

如果您以这种方式调用“addActivityLogs”方法,则基本上省略了 Spring Transactions。

请查看我对类似问题的回答:Spring @Transactional TransactionRequiredException or RollbackException

长话短说:尝试使用您的“addActivityLogs”方法创建另一个 bean,并将这个 bean 注入到运行您的异步任务的那个中。那么它应该可以工作了。

【讨论】:

我无法在 run 方法中访问注入的 bean,如果我将整个逻辑放在 run 方法中,那么我也会遇到同样的异常

以上是关于错误:无法使用 spring 任务执行器获取当前线程的事务同步会话的主要内容,如果未能解决你的问题,请参考以下文章

使用spring的定时任务时遇到重复执行

Spring 定时任务实现 以及无法正常执行分析

activiti动态获取当前流程节点的操作按钮

Springboot 定时任务,service层无法注入问题详细解决

2008R2服务器登录提示:远程桌面服务当前正忙,因此无法完成您尝试执行的任务。

java定时任务 spring配置了定时器 在执行run()时调用service 但是却得不到hiberbate的连接