当前位置:  开发笔记 > 运维 > 正文

在servlet容器中启动线程池

如何解决《在servlet容器中启动线程池》经验,为你挑选了1个好方法。

我有一个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作为选项.



1> cletus..:

这不是servlet容器的用途.如果您打算使用基于标准的方法,那么您真的需要一个更加完善的J2EE应用程序服务器.你将拥有的是其他黑客攻击,但它们可能足以完成你的任务.

我可能会尝试创建一个DaemonServlet.这只是一个没有映射到URL的普通servlet(可能是用于监视目的的盲目URL,尽管更喜欢JMX用于此类事情).init()加载servlet时调用该方法.你可以在那里开始一个线程.可以说你可能需要创建两个:一个完成工作.另一个确保第一个正在运行,并destroy()在调用后正常终止它.

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

实际上,我有一个更好的建议.使用异步消息使用者,这将更加清晰和可扩展,但这是基于基于JMS的解决方案,而不仅仅是一个LinkedBlockingQueue(而且JMS可能是一个更好的想法).根据您的约束,您可能没有选择JMS作为选项.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有