![[8.5.5.4 或更高版本]](../ng_v8554.gif)
配置受管计划执行程序
可配置 ManagedScheduledExecutorService 实例来安排异步任务以与从中安排该任务的线程的线程上下文一起运行。Java™ EE 应用程序最好避免直接管理它们自己的线程;因此,ManagedScheduledExecutorService 扩展 JSE ExecutorService 来提供一种方法以在应用程序服务器环境内安排异步任务。您还可配置 ManagedScheduledExecutorService 以捕获与 Java EE 应用程序相关的线程上下文并将其传播至计划任务的线程。
关于此任务
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
线程上下文捕获和传播由上下文服务管理。服务器创建上下文服务的缺省实例 (DefaultContextService),并将其配置为至少传播 classloaderContext、jeeMetadataContext 和 securityContext。如果已创建 ManagedScheduledExecutorService 但未引用特定上下文服务实例或直接在其中配置上下文服务实例,那么会使用此缺省上下文服务实例。有关上下文服务实例的更多信息,请参阅“配置线程上下文服务实例”主题。
缺省受管计划执行程序实例 (DefaultManagedScheduledExecutorService) 以 java:comp/DefaultManagedScheduledExecutorService 形式提供,并使用缺省上下文服务实例来捕获和传播线程上下文。
过程
server.xml 文件中的示例配置:
示例
将受管计划执行程序插入至应用程序组件(通过使用 @Resource)或使用资源环境引用 (resource-env-ref) 进行查找。不管如何获取该实例,都可按可互换方式将其用作 javax.enterprise.concurrent.ManagedScheduledExecutorService 或以下任何超类:java.util.concurrent.ScheduledExecutorSerivce、java.util.concurrent.ExecutorService 和 javax.enterprise.concurrent.ManagedExecutorService
- 使用 @Resource 以插入为 java.util.concurrent.ScheduledExecutorService 的示例:
@Resource(lookup="concurrent/scheduledExecutor2") ScheduledExecutorService executor; ... // schedule a task to run every half hour from now Runnable updateSalesReport = new Runnable() { public void run() throws Exception { // java:comp lookup is possible because <jeeMetadataContext> is configured DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... query and update various database tables } }; ScheduledFuture<?> future = executor.scheduleAtFixedRate(updateSalesReport, 0, 30, TimeUnit.MINUTES);
- 使用 @Resource 以插入为 javax.enterprise.concurrent.ManagedScheduledExecutorService 的示例:
@Resource(lookup="concurrent/scheduledExecutor2") ManagedScheduledExecutorService executor; ... usage is same as previous example
- web.xml 文件中的 java.util.concurrent.ScheduledExecutorService 的示例 <resource-env-ref>:
<resource-env-ref> <resource-env-ref-name>concurrent/scheduledExecutor1</resource-env-ref-name> <resource-env-ref-type>java.util.concurrent.ScheduledExecutorService</resource-env-ref-type> </resource-env-ref>
- web.xml 文件中的 javax.enterprise.concurrent.ManagedScheduledExecutorService 的示例 <resource-env-ref>:
<resource-env-ref> <resource-env-ref-name>concurrent/scheduledExecutor2</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.concurrent.ManagedScheduledExecutorService</resource-env-ref-type> </resource-env-ref>
- 使用资源环境引用的示例查询:
ManagedScheduledExecutorService executor = (ManagedScheduledExecutorService) new InitialContext().lookup("java:comp/env/concurrent/scheduledExecutor2"); executor.schedule(payrollTask, fridaysAtMidnightTrigger);