引言
IBM WebSphere Application Server 软件提供了以下两种机制,以支持 J2EE 应用程序开发人员在 Servlet 和 EJB 组件中安全地使用线程:
异步 Bean
Commonj Timer and WorkManager for Application Servers 1.1 规范。
两种编程模式都允许您创建池线程和守护程序线程,以便运行 J2EE 业务逻辑。
在两种编程模式中,线程可以由不同的应用程序重用。当应用程序逻辑开始和终止时,这可以通过应用和删除线程内外的 J2EE 上下文信息来完成。因此,单个线程池可以由多个应用程序使用。每次使用线程时,其标识都会更改。
每次重用线程时,都必须更改线程的上下文,对于可能很少在这些线程执行活动的应用程序,开销会特别大。在这些情况下,需要一个组件范围的线程池,并在每个线程上具有固定的 J2EE 上下文。这可以通过使用 Asynchronous Beans EventSource 接口来完成。
本文介绍如何使用 Asynchronous Beans EventSource 构造线程工厂,文中还包括一个称为并发适配器 (Concurrent Adapter) 的可下载示例,它可以与第三方线程池实现一起使用,以创建能够在 WebSphere Application Server 上工作的快速线程池。
全局线程池
WebSphere Application Server 提供了高性能和高伸缩性的线程池实现。异步 Bean 和 Commonj 的 WorkManager 对所有池线程都使用此线程池。
由于 WorkManager 实例可用于全局命名空间,所以它们可以在多个应用程序之间共享,因此需要 J2EE 上下文切换。为完成此任务,WorkManager 在提交工作时会获取线程上 J2EE 上下文的快照。产生的对象将成为 WorkWithExecutionContext (WWEC) 对象(图 1)。
图 1. WorkWithExecutionContext
如果将WorkManager 用作全局线程池(图 2),则每次向线程分配工作时,提交给线程池的每项工作都将具有应用于线程(或从线程中删除)的应用程序上下文:
将工作提交给 WorkManager 线程池(蓝框)
获取 J2EE 应用程序上下文的快照,并将其作为 WWEC 对象与该工作存储在一起。
将 WWEC 添加到池的输入队列。
工作线程从输入队列提取一个 WWEC,并运行它。
获取工作线程上当前 J2EE 应用程序上下文的快照,以便在工作完成之后进行恢复。
将与 WWEC 一起存储的 J2EE 上下文应用到线程。
运行工作。