- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个处理来自第 3 方站点的回调的 servlet S。
回调调用按特定顺序发生。因此,我需要对它们进行排队。
我建议使用像
这样的内存队列java.util.ConcurrentLinkedQueue
所以逻辑看起来是这样的:
据我了解,Servlet S 的每个实例都在其自己的线程中执行。
如何为整个 web 应用程序(war)创建一个消费者线程来为队列提供服务?基本上我需要以下的单例实例:
最佳答案
这不是 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/
我是一名优秀的程序员,十分优秀!