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

标签 java spring multithreading http lambda

我们有一个 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/

相关文章:

java - AWS Corretto 示例应用程序源

Java 内存模型实践

此代码的 Java 适当 I/O 为空终止字符

java - 在 Firebase 中自动增加一个值

java - Spring MVC 中未调用 Servlet 映射 URL

java - 除非在 DAO 内部,否则交易无法进行

java - 是否存在竞争条件,或者对同一对象的同一方法进行多次调用时如何工作

java - 在Java中获取并行执行的两个 block 的结果

javascript - Digger 游戏中的敌人需要自行移动,代码被破坏,我不知道为什么

Spring SecurityContext 在页面加载后被清除