Java 如何在webapp中使用ExecutorService

Java 如何在webapp中使用ExecutorService,java,executorservice,Java,Executorservice,我有一个restfulwebapp。请求可以包含大量数据。因此,在RESTfulWebService逻辑中,我想将处理分为两部分。第一部分将接收数据、验证数据并将数据保存到数据库。第二部分是对数据进行检查,并将业务逻辑应用到数据中。第二部分可能需要一段时间才能完成 所以我想让第二部分成为可运行的,并使用ExecutorService,比如 `Executors.newCachedThreadPool()` 所以我想我可以有一个单例来保存这个ExecutorService实例,当第一部分完成时,

我有一个restfulwebapp。请求可以包含大量数据。因此,在RESTfulWebService逻辑中,我想将处理分为两部分。第一部分将接收数据、验证数据并将数据保存到数据库。第二部分是对数据进行检查,并将业务逻辑应用到数据中。第二部分可能需要一段时间才能完成

所以我想让第二部分成为可运行的,并使用ExecutorService,比如

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

但我不确定有几个问题:

  • 这是使用ExecutorService的正确方式吗?有没有更好的办法

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

  • 如何以及何时启动Executor服务的关闭

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

  • 谢谢,
    Helen

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

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


    这样就可以进行分工和异步处理。

    这样使用也可以。
    通过在web.xml中注册上下文侦听器,您应该能够(不确定wildfly)控制启动和关闭

    <listener>
        <listener-class>com.stackOv.MyContextListener</listener-class>
    </listener>
    

    API不需要使用步骤2的输出。我的理解是,如果我有一个ExecutorService实例正在运行,并且每个步骤2都提交给ExecutorService,那么步骤1可以在将作业提交给ExecutorService之后立即向调用者返回响应,而无需等待步骤2。但是你是说我应该有另一个守护进程来处理数据,这样API就不用担心第2步了。对吧?没错。API不必担心步骤2,我明白了。我想我需要一个调度器来检查处理失败的记录。第二步可能只是其中的一部分。
    class MyContextListener implements ServletContextListener {
            @Override
            public void contextInitialized(ServletContextEvent event) {
                // start
            }
    
            @Override
            public void contextDestroyed(ServletContextEvent event) {
                // shutdown
            }
    }