如何在Jetty 9.4.x中的servlet上下文中动态添加和删除servlet?

时间:2018-01-12 19:39:04

标签: java servlets jetty osgi

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

2 个答案:

答案 0 :(得分:0)

只能添加Servlet,而不能删除。

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

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

答案 1 :(得分:0)

几年前我在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和过滤器的地方):{{3 }}