我有一个安静的网络应用程序。请求可以包含大量数据。所以在宁静的Web服务逻辑中,我想将处理分为两部分。第一部分将接收数据,验证数据并将数据保存到数据库。第二部分是真正经历数据并将业务逻辑应用于它。第二部分可能需要一段时间才能完成。
所以我想把第二部分作为Runnable,并使用ExecutorService,比如
`Executors.newCachedThreadPool()`
所以我认为我可以有一个单例来保存这个ExecutorService实例,当第一部分完成时,它可以将作业提交给ExecutorService,ExecutorService将执行第二部分。 这样ExecutorService将保存一个线程池,该线程也可以重用。所以基本上我使用ExecutorService进行后台处理
但我不确定几个问题:
这是使用ExecutorService的正确方法吗?有没有更好的方法呢?
由于我已经在webapp服务器中(我正在使用Wildfly),我还可以像这样使用ExecutorService吗?不知何故,我觉得ExecutorService通常用于服务器端或独立应用程序。
如何以及何时初始化ExecutorService的关闭?
由于我将它作为Singleton,我希望这个ExecutorService实例一直运行,直到取消部署应用程序或服务器关闭。那么何时以及如何触发shutdownNow()? 当服务器关闭时,即使ExecutorService中的任务没有完成,我想我无法控制它。我能做些什么来至少记录一些东西吗?
谢谢, 海伦
答案 0 :(得分:0)
API的调用者是否同步使用步骤2(业务逻辑处理)的输出?如果不是,我建议不要将第二步作为REST API的一部分。
您可以公开API以仅执行步骤1(验证并保存到DB)。对于步骤2,您可以拥有一个定期唤醒的守护程序,并检查自上次处理的时间以来是否有任何新数据需要处理。有多种方法可以实现此计划任务,例如
通过这种方式,您可以获得分工和异步处理。
答案 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
}
}