我有一些建议,但是它们要求您稍微修改一下体系结构,以便更好地使用容器环境。
Servlet容器支持可获取各种事件通知的“侦听器”。具体来说,其中之一是
ServletContextListener当上下文(通过Web
contextInitialized方法)投入使用(通过方法)和何时将其退出服务(通过
contextDestroyed方法)时得到通知的通知。
我的建议是执行以下操作:
- 更改
Consumer
类的构造函数,使其不会自动调用consume()
; 而是添加一个类似的公共方法,consumeOnce
并且根本不要在该级别使用循环 - 编写一个
ServletContextListener
以Consumer
和Thread
作为成员的引用以及一个volatile boolean stop
标志;在contextInitialized
其中应该创建一个新Consumer
对象,然后启动一个新的(守护程序)线程,该线程:- 来电
Consumer.consumeOnce
- 要求
Thread.sleep
适当的时间 - 循环执行前2个步骤,直到stop标志为true
- 来电
- 让您
ServletContextListener
的contextDestroyed
方法将stop标志设置为true
并Thread.interrupt
在正在运行的线程上调用。
我确定我缺少一些确切的细节,但这是一般的想法。当Tomcat关闭时,您的代码将收到关闭通知,您可以干净地终止自己的循环线程。您可能需要提供一种方法,使之
Consumer在尝试获取
Thread.interrupt信号时不中止,从而中止尝试消耗其所消耗的任何东西(例如,停止等待从空队列中拉出对象)。(例如,如果您使用一个
Object.wait()命令来等待监视器通知,那么您将需要更改它,以便它使用带有超时的等待命令,这样您就不会永远阻塞。)



