在异步任务中使用Spring Data Session bean。范围'会议'当前线程无效

时间:2017-07-10 11:13:55

标签: java spring spring-mvc spring-data spring-data-neo4j

我的下一个流程将在我的Spring MVC Web应用程序中实现:

  • 用户在页面上插入一些值,即向服务器发送POST
  • 基于此值,控制器启动一个长时间运行的后台任务,即非常繁重(大约一个小时左右),因此绝对需要异步。
  • 在此任务期间,需要读/写数据库(在我的例子中是Neo4j)

我是如何做到的:

  1. 我们在范围'会话':
  2. 中有bean
    @Bean
    @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public Session getSession() throws Exception {
        return super.getSession();
    }
    
    1. 在我的控制器中,我有一些数据库存储库:
    2. @Autowired
      SomeDBRepo repo;
      
      1. 我有一个方法,由@Async
      2. 注释
        @Async 
        doSomeAsync() {
           repo.findAll();
        }
        

        我收到此错误:

        Error creating bean with name 'scopedTarget.getSession': Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

        我已经阅读了一些关于这个问题的文章,但没有任何帮助。这个问题怎么解决?

1 个答案:

答案 0 :(得分:0)

Spring中的会话和请求范围是线程绑定的。

当您使用@Async注释方法时,执行将在另一个线程中进行,并且无法访问调用方的范围(以及会话)。

尝试在您的异步bean中注入SessionFactory以获取会话。

顺便说一下,你确定你真的需要会话范围吗?这会将OGM会话存储在Web会话中,这会导致加载时出现内存问题,因为会话充当数据库的第一级缓存。