适用于Java SE的ManagedExecutorService、ManagedTask和ManagedTaskListener替代方案
我最近使用GlassFish/Payara构建了一个JavaEE7Web应用程序。 web应用程序根据需要在底层操作系统上启动长时间运行的任务(>2小时)。这些任务基本上是用Python、Ruby或Java编写并使用命令行(ApacheCommonsExec)执行的其他程序或脚本。因为我想告诉用户任务的当前状态,并让他有可能取消正在运行的任务,所以我使用了以下JavaEE特性和库 下面的列表简要介绍了我决定使用特定JavaEE特性或外部库的原因适用于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
- ManagedExecutorService
- 使用@Resource注入,允许我对可运行文件进行排队,并在自己的线程中执行它们
- ManagedTaskListener实施
- 这就是我决定使用ManagedExecutorService并在应用服务器中运行线程的原因
- 该界面提供了四种非常方便的方法(taskSubmitted、taskAborted、taskDone和taskStarting)
- 这允许我更新长时间运行的任务状态(JPA),并在状态发生变化时通知用户
- 可运行、可管理的任务实施
- 在这里,我通过重写run()方法定义了实际的长时间运行任务
- 为了对状态更改做出反应,我还注册了ManagedTaskListener实现,如前所述
- apachecommons执行Util
- 为了实际执行长时间运行的任务,Runnable和ManagedTask实现只使用ApacheCommonsExec
- 为了能够取消长时间运行的进程,我为每个DefaultExecutor设置了一个ShutdowHookProcessDestroyer
- 使用defaultExecutor.getWatchdog().destroyProcess();这让我可以干掉一个正在运行的任务
ManagedTask
/ManagedTaskListener
,但这应该可以通过可运行/可调用的实现轻松实现
旁注:当您使用ManagedTask时,这是在ManagedTask上设置
ManagedTask.LONGRUNNING\u HINT=true
的完美方案。例如:
managedTask.getExecutionProperties().put(ManagedTask.LONGRUNNING_HINT, "true");
“要求我们推荐或查找书籍、工具、软件库、教程或其他非网站资源的问题对于堆栈溢出来说是离题的,因为它们往往会吸引固执己见的答案和垃圾邮件。”