Itt*_*tai 1 java singleton multithreading servlets
我目前有一个web应用程序,我有Servlets读取和写入ServletContext
属性,我有"工作"线程(守护程序线程),它在启动时初始化,并且当前作为ServletContext
对象成员保存.出于几个原因,我正在考虑Runnable
转而使用"实现"而且我有点困惑的事实是我需要一个servlet和非servlet可以用来互相交流的公共资源,我觉得我有点陷入整个ServletContext
范式.我很感激,如果有人可以提供关于为什么使用ServletContext
(我的方式或其他方式)的点,而且我正在考虑使用一个单例类,它将在启动时初始化并且将是线程安全的,我将只是通过它路由servlet和非servlet的所有通信.你怎么看?
谢谢
Java Servlet容器实际上是一个轻度托管的代码容器.Servlet是具有非常明确的生命周期的组件,并且在容器和组件(也可以包括过滤器)之间也存在非常明确的合同.
如上所述,web-app是被动反应系统.
它是被动的,因为没有(严格地)允许用户定义的线程.(某些容器可能不会强制执行此限制,但是通过生成自己的线程,您实际上不在预订范围内,并且可能会发生不可预测的行为.)
从某种意义上说,它是反应性的,即服务器上的活动(在您的代码库中)响应请求而发生,这些是针对典型的Servlet应用程序HTTP请求.
ServletContext是容器中给定Web应用程序的所有组件的共享上下文.此上下文在Web应用程序激活时创建,在停用时销毁.您可以使用ServletContextListener组件挂钩到此生命周期并获取有关生命周期事件的通知回调.
如果您愿意在野外继续并在Web应用程序中生成活动元素,那么您可能希望考虑以下事项:
1 - 创建并注册ServletContextListner组件以管理活动组件.在web-app启动/激活时,您将从容器中获得回调.在这里,您可以启动线程组件.由于此组件将传递对ServletContext的引用,因此您可以将该引用传递给线程组件.
2 - 您的线程组件类(无论是Thread的扩展还是Runnable的实现)都需要是可管理的,因为您需要提供在ServletContextListener接收上下文关闭回调时干净地关闭线程的方法.如果您要正式化可运行的任务,ExecutorService提供您需要的功能,因此您不必重新发明轮子.
也就是说,您可能希望检查您的要求,从而检查您选择的设计和Web容器平台.可能你真的需要更复杂的后端堆栈.
归档时间: |
|
查看次数: |
4808 次 |
最近记录: |