gpt4 book ai didi

java - Spring:从 Web App 线程子线程(来自 ThreadPool)访问请求( session )作用域 Bean

转载 作者:可可西里 更新时间:2023-11-01 17:05:39 34 4
gpt4 key购买 nike

我们有一个 Spring Web 应用程序。 API 是通过 Jersey 实现的,而网络服务器是 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 App 线程子线程(来自 ThreadPool)访问请求( session )作用域 Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45453500/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com