适用于Java SE的ManagedExecutorService、ManagedTask和ManagedTaskListener替代方案

适用于Java SE的ManagedExecutorService、ManagedTask和ManagedTaskListener替代方案,java,multithreading,guava,java-ee-7,apache-commons-exec,Java,Multithreading,Guava,Java Ee 7,Apache Commons Exec,我最近使用GlassFish/Payara构建了一个JavaEE7Web应用程序。 web应用程序根据需要在底层操作系统上启动长时间运行的任务(>2小时)。这些任务基本上是用Python、Ruby或Java编写并使用命令行(ApacheCommonsExec)执行的其他程序或脚本。因为我想告诉用户任务的当前状态,并让他有可能取消正在运行的任务,所以我使用了以下JavaEE特性和库 下面的列表简要介绍了我决定使用特定JavaEE特性或外部库的原因 ManagedExecutorService

我最近使用GlassFish/Payara构建了一个JavaEE7Web应用程序。 web应用程序根据需要在底层操作系统上启动长时间运行的任务(>2小时)。这些任务基本上是用Python、Ruby或Java编写并使用命令行(ApacheCommonsExec)执行的其他程序或脚本。因为我想告诉用户任务的当前状态,并让他有可能取消正在运行的任务,所以我使用了以下JavaEE特性和库

下面的列表简要介绍了我决定使用特定JavaEE特性或外部库的原因

  • ManagedExecutorService
    • 使用@Resource注入,允许我对可运行文件进行排队,并在自己的线程中执行它们
  • ManagedTaskListener实施
    • 这就是我决定使用ManagedExecutorService并在应用服务器中运行线程的原因
    • 该界面提供了四种非常方便的方法(taskSubmitted、taskAborted、taskDone和taskStarting)
    • 这允许我更新长时间运行的任务状态(JPA),并在状态发生变化时通知用户
  • 可运行、可管理的任务实施
    • 在这里,我通过重写run()方法定义了实际的长时间运行任务
    • 为了对状态更改做出反应,我还注册了ManagedTaskListener实现,如前所述
  • apachecommons执行Util
    • 为了实际执行长时间运行的任务,Runnable和ManagedTask实现只使用ApacheCommonsExec
    • 为了能够取消长时间运行的进程,我为每个DefaultExecutor设置了一个ShutdowHookProcessDestroyer
    • 使用defaultExecutor.getWatchdog().destroyProcess();这让我可以干掉一个正在运行的任务
我知道,将ManagedExecutorService与ManagedTasks结合使用来执行长时间运行的任务并不是最好的方法,但它工作得相当稳定

但是我知道我想在不同的物理机器上运行这些长时间运行的任务,并仅使用JavaSE执行它们。这意味着我没有ManagedExecutorService,因此没有ManagedTaskListener接口

有人有这种情况的经验吗?也许有一个提供类似功能的库。我认为谷歌番石榴提供了类似的功能,但没有提供相同的功能

我还感谢其他解决办法

多谢各位

使用Java SE执行器(即)提交可运行/可调用的文件,以进行必要的更新

您必须实现自己的等效于
ManagedTask
/
ManagedTaskListener
,但这应该可以通过可运行/可调用的实现轻松实现

旁注:
当您使用ManagedTask时,这是在ManagedTask上设置
ManagedTask.LONGRUNNING\u HINT=true
的完美方案。例如:

managedTask.getExecutionProperties().put(ManagedTask.LONGRUNNING_HINT, "true");

“要求我们推荐或查找书籍、工具、软件库、教程或其他非网站资源的问题对于堆栈溢出来说是离题的,因为它们往往会吸引固执己见的答案和垃圾邮件。”