代码之家  ›  专栏  ›  技术社区  ›  Ittai

为什么使用servlet上下文对象在包含Java中的servlet和“工作者”线程的Web应用程序中

  •  1
  • Ittai  · 技术社区  · 16 年前

    我目前有一个Web应用程序,其中我有servlet读写到 ServletContext 属性和我有“工作”线程(守护进程线程),这些线程在启动时初始化,当前作为成员保留 服务上下文 对象。 出于几个原因,我正在考虑转向“实施” Runnable “相反,我有点执着于这样一个事实:我需要一个共同的资源,servlets和非servlets可以使用这个资源彼此交谈,我觉得我有点陷入了整体之中。 服务上下文 范式。 如果有人能提供为什么使用 servletContext (以我的方式或其他方式)我还想使用一个singleton类,它将在启动时初始化,并且是线程安全的,我将通过它路由servlet和非servlet的所有通信。 你怎么认为?

    谢谢

    1 回复  |  直到 16 年前
        1
  •  7
  •   alphazero    16 年前

    JavaServlet容器实际上是一个轻管理的代码容器。servlet是具有很好定义的生命周期的组件,并且容器和组件(也可以包括过滤器)之间也有一个很好定义的契约。

    按照规定,Web应用程序是一个被动反应系统。

    它是被动的,从某种意义上说,不允许(严格地)使用用户定义的线程。(某些容器可能不会强制执行此限制,但通过生成您自己的线程,您实际上脱离了保留,可能会发生不可预测的行为。)

    它是响应性的,从某种意义上说,服务器上的活动(在代码库中)是响应请求而发生的,这些活动是针对典型的servlet应用程序HTTP请求的。

    servletContext是容器中给定Web应用程序的所有组件的共享上下文。此上下文在激活Web应用时创建,在停用Web应用时销毁。您可以使用servletContextListener组件来钩住这个生命周期,并获取有关生命周期事件的通知回调。

    如果你愿意继续狂野的一面,并在你的web应用中产生活跃的元素,那么你可能会考虑以下几点:

    1-创建并注册 ServletContextListner 用于管理活动组件的组件。在Web应用启动/激活时,您将从容器中收到回调。在这里,您可以启动线程组件。由于这个组件将被传递一个对servletContext的引用,所以您可以将这个引用传递给线程组件。

    2-线程组件类(无论是线程的扩展还是可运行的实现)需要是可管理的,从某种意义上说,当servletContextListener收到上下文关闭回调时,需要提供清理关闭线程的方法。如果您正准备正式化可运行的任务,那么 ExecutorService 提供您所需的功能,因此您无需重新设计车轮。

    也就是说,您可能希望检查您的需求,从而检查您选择的设计和Web容器平台。可能您真的需要更复杂的后端堆栈。