gpt4 book ai didi

multithreading - 在 servlet 容器中启动线程池

转载 作者:行者123 更新时间:2023-11-28 21:50:39 24 4
gpt4 key购买 nike

我有一个处理来自第 3 方站点的回调的 servlet S。

回调调用按特定顺序发生。因此,我需要对它们进行排队。

我建议使用像

这样的内存队列
java.util.ConcurrentLinkedQueue

所以逻辑看起来是这样的:

  • Servlet S 接收回调并将接收到的项放入队列 Q 中。
  • 此时,托管 servlet S 实例的线程将终止。
  • 消费者线程从 Q 中读取并连续处理每一个。

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

如何为整个 web 应用程序(war)创建一个消费者线程来为队列提供服务?基本上我需要以下的单例实例:

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

最佳答案

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

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

或者,如果您使用 Spring (而且,让我们面对现实,什么样的怪人不使用 Spring?),您可以简单地在应用程序上下文中创建一个 bean,它做很多相同的事情,除了 Spring 生命周期事件(例如 InitializingBean 上的 afterPropertiesSet()) .

其实,我有一个更好的建议。使用 asynchronous message consumers ,这将更清洁且更具可扩展性,但这是基于 JMS 的前提条件-based 的解决方案,而不仅仅是 LinkedBlockingQueue(而且 JMS 可能是一个更好的主意)。但是,根据您的限制,您可能无法选择 JMS。

关于multithreading - 在 servlet 容器中启动线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/393378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com