我有一个servlet S来处理来自第三方站点的回调.
回调调用以特定顺序发生.因此,我需要排队.
我建议使用内存中的队列
java.util.ConcurrentLinkedQueue
所以逻辑看起来像这样:
Servlet S接收回调并将收到的项目排队到队列Q.
到这时,托管servlet S实例的线程将终止.
消费者线程从Q读取并按顺序处理每个消息.
据我了解,Servlet S的每个实例都在自己的Thread中执行.
如何为将为队列提供服务的整个webapp(war)创建单个Consumer Thread?基本上我需要单例实例:
线程池
的ConcurrentLinkedQueue
cletus.. 5
这不是servlet容器的用途.如果您打算使用基于标准的方法,那么您真的需要一个更加完善的J2EE应用程序服务器.你将拥有的是其他黑客攻击,但它们可能足以完成你的任务.
我可能会尝试创建一个DaemonServlet.这只是一个没有映射到URL的普通servlet(可能是用于监视目的的盲目URL,尽管更喜欢JMX用于此类事情).init()
加载servlet时调用该方法.你可以在那里开始一个线程.可以说你可能需要创建两个:一个完成工作.另一个确保第一个正在运行,并destroy()
在调用后正常终止它.
或者,如果你正在使用Spring(并且,让我们面对它,什么样的whacko不使用Spring?),你可以简单地在应用程序上下文中创建一个bean,它做了很多相同的事情,除了Spring生命周期事件(例如,InitializingBean上的afterPropertiesSet()).
实际上,我有一个更好的建议.使用异步消息使用者,这将更加清晰和可扩展,但这是基于基于JMS的解决方案,而不仅仅是一个LinkedBlockingQueue
(而且JMS可能是一个更好的想法).根据您的约束,您可能没有选择JMS作为选项.
这不是servlet容器的用途.如果您打算使用基于标准的方法,那么您真的需要一个更加完善的J2EE应用程序服务器.你将拥有的是其他黑客攻击,但它们可能足以完成你的任务.
我可能会尝试创建一个DaemonServlet.这只是一个没有映射到URL的普通servlet(可能是用于监视目的的盲目URL,尽管更喜欢JMX用于此类事情).init()
加载servlet时调用该方法.你可以在那里开始一个线程.可以说你可能需要创建两个:一个完成工作.另一个确保第一个正在运行,并destroy()
在调用后正常终止它.
或者,如果你正在使用Spring(并且,让我们面对它,什么样的whacko不使用Spring?),你可以简单地在应用程序上下文中创建一个bean,它做了很多相同的事情,除了Spring生命周期事件(例如,InitializingBean上的afterPropertiesSet()).
实际上,我有一个更好的建议.使用异步消息使用者,这将更加清晰和可扩展,但这是基于基于JMS的解决方案,而不仅仅是一个LinkedBlockingQueue
(而且JMS可能是一个更好的想法).根据您的约束,您可能没有选择JMS作为选项.