Java 如何在webapp中使用ExecutorService
我有一个restfulwebapp。请求可以包含大量数据。因此,在RESTfulWebService逻辑中,我想将处理分为两部分。第一部分将接收数据、验证数据并将数据保存到数据库。第二部分是对数据进行检查,并将业务逻辑应用到数据中。第二部分可能需要一段时间才能完成 所以我想让第二部分成为可运行的,并使用ExecutorService,比如Java 如何在webapp中使用ExecutorService,java,executorservice,Java,Executorservice,我有一个restfulwebapp。请求可以包含大量数据。因此,在RESTfulWebService逻辑中,我想将处理分为两部分。第一部分将接收数据、验证数据并将数据保存到数据库。第二部分是对数据进行检查,并将业务逻辑应用到数据中。第二部分可能需要一段时间才能完成 所以我想让第二部分成为可运行的,并使用ExecutorService,比如 `Executors.newCachedThreadPool()` 所以我想我可以有一个单例来保存这个ExecutorService实例,当第一部分完成时,
`Executors.newCachedThreadPool()`
所以我想我可以有一个单例来保存这个ExecutorService实例,当第一部分完成时,它可以将作业提交给ExecutorService,ExecutorService将执行第二部分。
这样,ExecutorService将拥有一个线程池,线程也可以重用。所以基本上我使用ExecutorService进行后台处理
但我不确定有几个问题:
HelenAPI的调用方是否同步使用步骤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
}
}