【发布时间】:2011-10-03 16:42:28
【问题描述】:
场景:
我们有一个在 Websphere 中运行的 Spring 托管 Web 应用程序。 (春季 3.0.x,WAS 7)
webapp 通过 Spring 的 WorkManagerTaskExecutor(配置为 10 的线程池大小)利用 Websphere 的工作管理器来执行计算密集型数据库读取操作。所以基本上,一个请求会生成,比如说,10 个不同的文档。要生成文档,只需要读取数据库来收集/处理数据。因此,我们基本上生成了 10 个线程来处理 10 个文档,最后收集从 10 个工作人员返回的 10 个文档,并将它们合并并写回一个大响应给客户端。我们发现,当 10 个线程正在收集/处理数据时,会进行大量类似的数据库调用。所以我们想出的是围绕执行次数最多的数据库方法创建一个方面来缓存响应。方面配置为单例,方面使用的缓存自动装配到方面,范围设置为请求范围,以便每个请求都有自己的缓存。
问题:
现在这种方法的问题在于,当线程正在执行它们的 db 调用并且 Aspect 插入时,我们会收到 java.lang.IllegalStateException: No thread-bound request found 异常。我理解这是完全有效的,因为线程是在请求上下文之外执行的。
有没有办法绕过这个问题?是否可以将具有请求范围缓存的方面应用于这些线程调用的方法?
【问题讨论】:
标签: java multithreading spring