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

时间:2015-12-03 10:32:19

标签: jax-rs scheduled-tasks websphere-liberty

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

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

在我的init类中实现ServletContextListener

如何在其他一些类中创建更多实例?

我可以找到ManagedExecutorService的指针,如: http://www.adam-bien.com/roller/abien/entry/injecting_an_executorservice_with_java
我已经尝试使用ManagedScheduledExecutorService,但它没有用。

但是我无法获得ManagedScheduledExecutorService资源的大量信息。

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

2 个答案:

答案 0 :(得分:2)

您目前使用的注入示例正在使用默认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);

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

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

答案 1 :(得分:1)

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

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