在Java EE中,我使用EJB Timer Service安排了任务:
@Stateless
public class TestSchedule {
@Schedule(second = "*/30", minute = "*", hour = "*")
public void processFiles() {
}
}
由于Eclipse Micro Profile中不支持此方法,因此通常的实现方式是什么?
答案 0 :(得分:2)
使用EJB计时器
如果您使用的是WebSphere Liberty或OpenLiberty,则只需在server.xml中启用ejbLite-3.2
功能就可以引入EJB Lite功能(包括非持久EJB计时器):
<featureManager>
<feature>ejbLite-3.2</feature>
</feature>
如果需要永久 EJB计时器,则可以启用完整的ejb-3.2
功能。
请注意,您在原始问题中发布的代码来自JavaEE,而不是MicroProfile,但是Liberty服务器确实支持在同一服务器中同时使用JavaEE和MicroProfile技术。
使用Java EE并发
JavaEE并发实用程序是非持久EJB计时器的另一种更现代/更轻巧的替代方案。可以使用server.xml中的concurrent-1.0
功能启用此功能:
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
要使用它,可以像这样向Callable
提交Runnable
或ManagedScheduledExecutorService
对象:
@Resource
ManagedScheduledExecutorService exec;
// ...
public void startWork() {
// Use a Java 8 lambda to define the Runnable
exec.scheduleAtFixedRate(() -> {
System.out.println("This will run every 30 seconds.");
}, 30, TimeUnit.SECONDS);
}
如果您刚开始编写此应用程序,由于EE并发功能更轻巧,并且MicroProfile当前正在寻求将类似功能与MicroProfile Concurrency project结合使用,因此建议您通过EJB计时器使用Java EE并发实用程序。但是,如果您需要使用 persistent 任务,请使用EJB计时器。
答案 1 :(得分:0)
好吧,发现该解决方案至少在payara-micro上添加了:将Java EE Web依赖项添加到maven依赖项中。