2017-08-02 44 views
1

我们有一个Spring Web应用程序。在Web服务器是jetty的情况下,API使用Jersey实现。Spring:从Web应用程序线程访问请求(会话)作用域Bean线程(来自线程池)

我们希望能够从并行lambda表达式和多线程Apache Camel路由中访问请求作用域bean,并由父线程初始化。

可以让子线程从父线程继承请求上下文(通过InheritableThreadLocal变量)。虽然问题是这些属性是没有传递给子线程,因为它们是从线程池(单独的lambda和骆驼)重新使用。

无法通过参数传递请求绑定信息 - 我们在项目中有太多需要更改的方法。

回答

0

您可以通过首先得到的参数

SecurityContext context = SecurityContextHolder.getContext(); 
RequestAttributes attributes = RequestContextHolder.currentRequestAttributes(); 

而像

SecurityContextHolder.setContext(context); 
RequestContextHolder.setRequestAttributes(attributes, true); 

我正面临着我的应用程序读取文件的输入同样的问题,它们设置你的线程里面做一个休息请求逐行解析并将记录插入到数据库中。

但是该文件包含超过5个lac记录,并且该过程花费了太多时间。所以我决定采用并行流。

下面的代码为我工作

public void saveRecordsFromFile(MultipartFile file) { 

    // Getting security and request params 
    SecurityContext context = SecurityContextHolder.getContext(); 
    RequestAttributes attributes = RequestContextHolder.currentRequestAttributes(); 

    try (BufferedReader br = new BufferedReader(new InputStreamReader(file.getInputStream()))) { 

     // Reading the file line by line and making rule 
     br.lines().parallel().forEach(line -> { 

      // Setting security and request params for current thread 
      SecurityContextHolder.setContext(context); 
      RequestContextHolder.setRequestAttributes(attributes, true); 

      saveRecord(line); 

     }); 
    } catch (Exception ex) { 
     throw new SystemException("Error while input file", ex); 
    } 
}