如何在 webapp 中使用 ExecutorService

how to use ExecutorService in webapp

我有一个 restful 网络应用程序。请求可以包含大量数据。所以在 restful 网络服务逻辑中,我想将处理分成两部分。第一部分将接收数据,验证数据并将数据保存到数据库。第二部分实际上是遍历数据并对其应用业务逻辑。第二部分可能需要一段时间才能完成。

所以我想将第 2 部分设为 Runnable,并使用 ExecutorService,例如

`Executors.newCachedThreadPool()`

所以我想我可以有一个单例来保存这个 ExecutorService 实例,当第一部分完成时,它可以将作业提交给 ExecutorService,ExecutorService 将执行第二部分。 这样ExecutorService就会持有一个线程池,线程也可以被复用。所以基本上我使用 ExecutorService 进行后台处理

但是有几个问题我不太确定:

  1. 这是使用 ExecutorService 的正确方法吗?有没有更好的方法呢?

    因为我已经在一个 webapp 服务器中(我正在使用 Wildfly),我也可以像这样使用 ExecutorService 吗?不知何故,我觉得 ExecutorService 通常在服务器端或独立应用程序中使用。

  2. 如何以及何时初始化 ExecutorService 的关闭?

    由于我将其作为 Singleton,我希望此 ExecutorService 实例保持 运行 直到应用程序被取消部署或服务器关闭。那么何时以及如何触发 shutdownNow() 呢? 另外,当服务器关闭时,甚至 ExecutorService 中的任务都没有完成,我想我无法控制它。我能做些什么来至少记录一些东西吗?

谢谢, 海伦

API的调用者是否同步消费步骤2(业务逻辑处理)的输出?如果不是,我建议不要将第二步作为 REST API.

的一部分

您可以公开一个 API 以仅执行第 1 步(验证并保存到数据库)。对于第 2 步,您可以让守护进程定期唤醒并检查自上次处理时间以来是否有任何新数据要处理。这个定时任务有多种实现方式,一个例子是Spring Scheduled Task

这样就得到了分工和异步处理。

这样用也可以
您应该能够(不确定 wildfly)通过在 web.xml

中注册上下文侦听器来控制启动和关闭
<listener>
    <listener-class>com.stackOv.MyContextListener</listener-class>
</listener>

并像这样实现它

class MyContextListener implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent event) {
            // start
        }

        @Override
        public void contextDestroyed(ServletContextEvent event) {
            // shutdown
        }
}