一尘不染

在servlet容器中启动线程池

tomcat

我有一个Servlet S,它处理来自第三方网站的回调。

回调调用以特定顺序发生。因此,我需要将它们排队。

我建议使用内存队列

java.util.ConcurrentLinkedQueue

所以逻辑看起来像这样:

  • Servlet S接收回调,并将接收到的项目排队到队列Q中。
  • 到那时,托管Servlet S实例的线程将终止。
  • 使用者线程从Q读取并依次处理每个线程。

据我了解,Servlet S的每个实例都在其自己的线程中执行。

如何为将为队列提供服务的整个web应用程序(战争)创建单个使用者线程?基本上我需要以下单例:

  1. 线程池
  2. 并发链接队列

阅读 409

收藏
2020-06-16

共1个答案

一尘不染

这不是servlet容器的目的。如果要使用基于标准的方法,则确实需要功能更完善的J2EE应用程序服务器。否则,您将拥有骇客,但它们可能足以完成您的任务。

我可能会尝试创建一个DaemonServlet。这只是一个普通的servlet,没有映射到URL(也许出于监视目的,可能是盲URL除外,尽管这种情况更喜欢JMX)。init()加载Servlet时将调用该方法。您可以在其中启动线程。可以说,您可能需要创建两个:一个可以完成工作。另一个确保第一个正在运行,并在destroy()被调用后正常终止它。

另外,如果您使用的是Spring(面对现实,什么样的whacko不使用Spring?),您可以在应用程序上下文中简单地创建一个具有相同功能的bean,但Spring生命周期事件除外(例如InitializingBean上的afterPropertiesSet())。

实际上,我有一个更好的建议。使用异步消息使用者,它将更加干净和可扩展,但这是基于基于JMS的解决方案的依据,而不是仅仅基于LinkedBlockingQueue(并且JMS可能是一个更好的主意)。但是,根据您的约束,可能没有JMS可供选择。

2020-06-16