java - Java SE 的 ManagedExecutorService、ManagedTask 和 ManagedTaskListener 替代方案

标签 java multithreading guava java-ee-7 apache-commons-exec

我最近使用 GlassFish/Payara 构建了一个 Java EE 7 Web 应用程序。
Web 应用程序在底层操作系统上按需启动长时间运行的任务(> 2 小时)。这些任务基本上是用 Python、Ruby 或 Java 编写并使用命令行 (Apache Commons Exec) 执行的其他程序或脚本。由于我想通知用户任务的当前状态并让他有可能取消正在运行的任务,因此我使用了以下 Java EE 功能和库。

以下列表简要描述了我决定使用特定 Java EE 功能或外部库的原因。

  • ManagedExecutorService
  • 使用@Resource 注入(inject),允许我对 Runnables 进行排队并在自己的线程中执行它们
  • ManagedTaskListener 实现
  • 这就是我实际上决定使用 ManagedExecutorService 并在应用程序服务器中运行线程的原因
  • 该界面给了我四个非常方便的方法(taskSubmitted、taskAborted、taskDone 和 taskStarting)
  • 这使我能够更新长期运行的任务状态 (JPA) 并在状态发生更改时通知用户
  • 可运行的托管任务实现
  • 在这里,我通过重写 run() 方法
  • 定义了实际的长时间运行任务。
  • 为了对状态变化使用react,我还注册了 ManagedTaskListener 实现,如前所述
  • Apache Commons Exec Util
  • 要实际执行长时间运行的任务,Runnable 和 ManagedTask 实现只需使用 apache commons exec
  • 为了能够取消长时间运行的进程,我为每个 DefaultExecutor
  • 设置了一个 ShutdownHookProcessDestroyer
  • 使用 defaultExecutor.getWatchdog().destroyProcess();这让我可以杀死一个正在运行的任务

  • 我知道将 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/

    相关文章:

    java - JSF应用程序: Open file,无法下载

    ios - 立即停止方法/对象?

    c# - 设备驱动程序 DLL 阻塞与非阻塞?

    java - Java 7 中 Guava 可选对象的条件运算符

    java - TimeLimiter 的 callWithTimeout 不起作用?

    java - 如何在我的程序 vscode 中加载 jar 文件?

    java - JFrame 的无响应 KeyListener

    java - 在按键时显示图像并将其保留在屏幕上直到线程停止

    wpf - WPF中的多线程

    GWT 集合性能和推荐做法