【问题标题】:How to dynamically add and remove servlets within a servlet context in Jetty 9.4.x?如何在 Jetty 9.4.x 的 servlet 上下文中动态添加和删除 servlet?
【发布时间】:2018-06-22 07:31:17
【问题描述】:

我想在 servlet 上下文中动态添加和删除 servlet。我知道如何使用 ContextHandlerCollection 动态添加多个 servlet 上下文。但是,我需要对上下文中的多个 servlet 执行相同的操作。一旦启动了 servlet 上下文,是否可以添加更多 servlet?

【问题讨论】:

    标签: java servlets jetty osgi


    【解决方案1】:

    Servlet 只能添加,不能删除。

    查看各种ServletContext.addServlet() 方法。

    但是请注意,您只能在 ServletContextListener.contextInitialized() 期间更改 ServletContext(请参阅 ServletContext.addServlet() 中的 javadoc 以了解 UnsupportedOperationException throwable)

    【讨论】:

    • 我认为你是对的。在上下文中它并没有真正的意义。上下文已经提供了处理一些动态变化的可能性。在上下文中,端点应该保持不变。我想跨上下文共享状态(即会话),Jetty 不建议这样做。但是,在实现方面还有其他几个选项可以解决这个问题。例如,在上下文中包含一个 servlet 或以其他方式共享状态信息。
    【解决方案2】:

    几年前我确实在 ECM 组件中实现了它,因此可以通过 ConfigAdmin 设置添加和删除 servlet,而无需在 OSGi 环境中重新启动 Jetty。

    因为是两年多前的事了,我不记得每一个细节,但你可以自己检查代码。在此处查看 CustomServletHandler 类的 updateServletsAndFilters() 函数:https://github.com/everit-org/jetty-server-ecm/blob/master/component/src/main/java/org/everit/jetty/server/ecm/internal/CustomServletHandler.java#L88

    一些提示:

    • 在 CustomServletHandler 子类中,我设置了一个标志 ignoreUpdateMapping,同时再次更新所有映射,否则父类将在每次迭代后应用新的 Servlet 数组计算完整的映射
    • 我使用 _ReadWriteLock_s,所以在更新期间,ServletHandler 将保留新请求,直到重新映射完成

    上面的函数是从 ServletContextHandlerFactoryComponent 类的 updateServletHandlerWithDynamicSettings() 函数调用的(这是根据配置预先收集映射、servlet 和过滤器的地方):https://github.com/everit-org/jetty-server-ecm/blob/master/component/src/main/java/org/everit/jetty/server/ecm/internal/ServletContextHandlerFactoryComponent.java#L86

    【讨论】:

    • 在 ServletContext 中有关 Servlet/Filter 添加/删除/更改的规则在 Servlet 3.0+ 中大大被搞砸了。您在 Servlet 2.5 中可以逃脱的(我没有违反任何规则)现在会导致违反 Servlet Spec 规则。您使用的 CustomServletHandler 方法现在已弃用(顺便说一句),现在 WebAppContext 配置甚至 ServletContext 本身都进行了检查,以使这些更新无效。
    • @JoakimErdfelt:我不使用在 Jetty 的最新代码中标记为已弃用的任何函数。 servlet 规范确实不能在动态环境中工作。问题不在于规格。但是关于基于 Jetty 特定 API 的动态解决方案。
    猜你喜欢
    • 2018-06-22
    • 2012-03-27
    • 1970-01-01
    • 2023-03-21
    • 2014-03-28
    • 2016-12-24
    • 2012-02-11
    • 2013-11-14
    • 2012-09-24
    相关资源
    最近更新 更多