错误:无法使用 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 任务执行器获取当前线程的事务同步会话的主要内容,如果未能解决你的问题,请参考以下文章
Springboot 定时任务,service层无法注入问题详细解决