gpt4 book ai didi

java - 在多线程 Web 应用程序中访问请求范围的 beans

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:12 25 4
gpt4 key购买 nike

场景:我们有一个在 Websphere 中运行的 Spring 管理的 Web 应用程序。 ( Spring 3.0.x,WAS 7)Web 应用程序通过 Spring 的 WorkManagerTaskExecutor(线程池大小配置为 10)利用 Websphere 的工作管理器来执行计算密集型数据库读取操作。所以基本上,一个请求进来生成,比方说,10 个不同的文档。要生成文档,只需要读取数据库来收集/处理数据。所以我们基本上产生 10 个线程来处理 10 个文档,最后收集从 10 个工作人员返回的 10 个文档并合并它们并写回一个大的响应给客户端。我们确定的是,当 10 个线程正在收集/处理数据时,会进行大量类似的数据库调用。所以我们想到的是围绕最常执行的数据库方法创建一个方面来缓存响应。方面被配置为单例,方面使用的缓存自动连接到范围设置为请求范围的方面,以便每个请求都有自己的缓存。

问题:现在这种方法的问题是,当线程正在执行它们的数据库调用并且切面被插入时,我们得到了 java.lang.IllegalStateException: No thread-bound request found 异常。我的理解是完全有效的,因为线程是在请求上下文之外执行的。

有没有办法解决这个问题?是否可以将具有请求范围缓存的方面应用于这些线程调用的方法?

最佳答案

我不认为你可以直接这样做。即使可以,也会有点难看。但是,您可以生成一个唯一的请求标识符(或者甚至 - 使用 session ID,但要小心多个选项卡),并将其传递给每个处理线程。然后方面可以使用该 id 作为缓存的键。缓存本身也会是单例的,但是会有Map<String, X> , 其中String是 ID,X 是您的缓存结果。

为了让事情更容易处理,你可以有 @Async方法(而不是手动生成线程),以及每个 @Async方法可以将缓存 ID 作为其第一个参数传递。

(当然,您的异步方法应该返回 Future<Result> 以便您可以在请求线程中收集它们的结果)

关于java - 在多线程 Web 应用程序中访问请求范围的 beans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7638003/

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