如何在 Eclipse MicroProfile 中添加定时器服务

How to add a timer service in Eclipse MicroProfile

在 Java EE 中,我使用 EJB 计时器服务来安排任务:

@Stateless
public class TestSchedule {

    @Schedule(second = "*/30", minute = "*", hour = "*")
    public void processFiles() {

    }
}

由于 Eclipse Micro Profile 不支持此方法...实现此方法的常用方法是什么?

好的,在 payara-micro 中找到了添加最少的解决方案:将 Java EE Web 依赖项添加到 maven 依赖项中。

使用 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 并发

非持久性 EJB 计时器的另一个 modern/lightweight 替代方案是 JavaEE 并发实用程序。这可以通过 server.xml 中的 concurrent-1.0 功能启用:

<featureManager>
  <feature>concurrent-1.0</feature>
</featureManager>

要使用它,您可以像这样将 CallableRunnable 对象提交给 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);
}

如果您刚刚开始编写此应用程序,我建议您使用 Java EE 并发实用程序而不是 EJB 计时器,因为 EE 并发更轻量级,而 MicroProfile 目前正在寻求将类似的功能与 MicroProfile Concurrency project。但是,如果您需要使用 持久性 任务,请使用 EJB 计时器。