如何在webapp中使用ExecutorService

时间:2018-06-07 17:01:39

标签: java executorservice

我有一个安静的网络应用程序。请求可以包含大量数据。所以在宁静的Web服务逻辑中,我想将处理分为两部分。第一部分将接收数据,验证数据并将数据保存到数据库。第二部分是真正经历数据并将业务逻辑应用于它。第二部分可能需要一段时间才能完成。

所以我想把第二部分作为Runnable,并使用ExecutorService,比如

`Executors.newCachedThreadPool()`

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

但我不确定几个问题:

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

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

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

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

  3. 谢谢, 海伦

2 个答案:

答案 0 :(得分:0)

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

您可以公开API以仅执行步骤1(验证并保存到DB)。对于步骤2,您可以拥有一个定期唤醒的守护程序,并检查自上次处理的时间以来是否有任何新数据需要处理。有多种方法可以实现此计划任务,例如Sample SWT application window

通过这种方式,您可以获得分工和异步处理。

答案 1 :(得分:0)

可以这样使用。
您应该能够(不确定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
        }
}