我最近使用 GlassFish/Payara 构建了一个 Java EE 7 Web 应用程序。
Web 应用程序在底层操作系统上按需启动长时间运行的任务(> 2 小时)。这些任务基本上是用 Python、Ruby 或 Java 编写并使用命令行 (Apache Commons Exec) 执行的其他程序或脚本。由于我想通知用户任务的当前状态并让他有可能取消正在运行的任务,因此我使用了以下 Java EE 功能和库。
以下列表简要描述了我决定使用特定 Java EE 功能或外部库的原因。
我知道将 ManagedExecutorService 与 ManagedTasks 结合使用来执行如此长时间运行的任务并不是最好的主意,但它工作得相当稳定。
但是知道我想在不同的物理机器上运行这些长时间运行的任务,并只使用 Java SE 来执行它们。这意味着我没有 ManagedExecutorService,因此没有 ManagedTaskListener 接口(interface)。
有没有人有这种情况的经验?也许有提供类似功能的库。我认为 Google Guava 提供了一些类似方向但不提供相同功能的东西。
我也感谢其他解决方案。
非常感谢你!
最佳答案
使用 Java SE 执行器(即 ScheduledExecutorService
)提交进行必要更新的 Runnable/Callable。
您必须实现自己的 ManagedTask
等价物。/ManagedTaskListener
,但这应该可以通过您的 Runnable/Callable 实现轻松实现。
边注:
当您使用 ManagedTask 时,这是设置 ManagedTask.LONGRUNNING_HINT=true
的完美场景在您的 ManagedTask 上。例如:
managedTask.getExecutionProperties().put(ManagedTask.LONGRUNNING_HINT, "true");
关于java - Java SE 的 ManagedExecutorService、ManagedTask 和 ManagedTaskListener 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34673212/