如何在 Jaxrs 中创建多个 ManagedScheduledExecutorService 资源

How to create multiple ManagedScheduledExecutorService resources in Jaxrs

我正在使用 WebSphere Liberty (wlp) 和 JAX-RS 开发一项服务。 我想在我的服务中 运行 多个调度程序来定期执行不同的任务。 我已经安装了 concurrent-1.0 功能并定义了

的实例
@Resource(name ="DefaultManagedScheduledExecutorService")
private ManagedScheduledExecutorService myScheduler;

在我的初始化 class 中实现了 ServletContextListener

如何在其他 class 中创建更多实例?

我可以找到 ManagedExecutorService 的指针,例如: http://www.adam-bien.com/roller/abien/entry/injecting_an_executorservice_with_java
我用 ManagedScheduledExecutorService 试过同样的方法,但没用。

但我无法获得有关 ManagedScheduledExecutorService 资源的太多信息。

请提供任何可能对此处有用的链接或指示。

查看此页面 Configuring managed scheduled executors 了解如何配置托管执行程序的详细信息。

您应该能够使用一个执行器,只需为您的不同任务调用多个 executor.schedule* 方法。

您当前的注入示例正在使用默认的 ManagedScheduledExecutorService,一旦您打开 concurrent-1.0 功能,它就可用。

要配置额外的 ManagedScheduledExecutorService,您只需在 server.xml 配置中定义更多,如下所示:

<managedScheduledExecutorService jndiName="concurrent/exec1"/>
<managedScheduledExecutorService jndiName="concurrent/exec2"/>
<managedScheduledExecutorService jndiName="concurrent/exec3"/>

但是,您确实没有理由需要额外的 ManagedScheduledExecutorService,除非它们将针对不同的任务应用不同的上下文服务配置。例如:

<managedScheduledExecutorService jndiName="concurrent/classloaderExec">
    <contextService>
        <classloaderContext/>
    </contextService>
</managedScheduledExecutorService>

<managedScheduledExecutorService jndiName="concurrent/jeeMetadataExec">
    <contextService>
        <jeeMetadataContext/>
    </contextService>
</managedScheduledExecutorService>

如果您只是想安排不同的任务,比如 myHourlyTaskmyDailyTask,您仍然可以使用相同的 ManagedScheduledExecutorService 资源来完成:

myScheduler.scheduleAtFixedRate(myHourlyTask, 0, 1, TimeUnit.HOURS);
myScheduler.scheduleAtFixedRate(myDailyTask,  0, 1, TimeUnit.DAYS);

在任何非资源 class 中声明和使用 ManagedScheduledExecutorService 默认资源实例:

/** The scheduler. */
private ManagedScheduledExecutorService monkeyScheduler;
try {
        monkeyScheduler = (ManagedScheduledExecutorService) 
                new InitialContext().lookup("java:comp/DefaultManagedScheduledExecutorService");
    } catch (NamingException e) {
        e.printStackTrace();
    }