我们有一个 Spring Web 应用程序。 API是用Jersey实现的,而Web服务器是jetty。
我们希望能够从并行 lambda 表达式和多播 Apache Camel 路由访问请求作用域 bean,由父线程初始化。
可以让子线程从父线程继承请求上下文(通过 InheritableThreadLocal 变量)。但问题是这些属性不会传递给子线程,因为它们从线程池中重用(单独的 lambda 和camel)。
也不可能通过参数传递请求绑定(bind)信息 - 我们项目中有太多需要更改的方法。
最佳答案
首先获取参数即可
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);
}
}
关于java - Spring:从 Web 应用程序线程子线程(来自 ThreadPool)访问请求( session )作用域 Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45453500/