如何在 Jetty 9.4.x 的 servlet 上下文中动态添加和删除 servlet?
How to dynamically add and remove servlets within a servlet context in Jetty 9.4.x?
我想在 servlet 上下文中动态添加和删除 servlet。我知道如何使用 ContextHandlerCollection 动态添加多个 servlet 上下文。但是,我需要对上下文中的多个 servlet 执行相同的操作。一旦 servlet 上下文启动,是否可以添加更多的 servlet?
Servlet 只能添加,不能删除。
查看各种 ServletContext.addServlet()
方法。
但是请注意,您只能在 ServletContextListener.contextInitialized()
期间更改 ServletContext
(请参阅 ServletContext.addServlet()
中的 javadoc 了解 UnsupportedOperationException
可抛)
几年前我确实在 ECM 组件中实现了它,因此可以通过 ConfigAdmin 设置添加和删除 servlet,而无需在 OSGi 环境中重新启动 Jetty 本身。
因为是两年多前的事了,记不太清楚了,大家可以自己去查代码。请参阅 CustomServletHandler class 的 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 subclass 中,我设置了一个标志 ignoreUpdateMapping,同时我再次更新所有映射,否则父 class 将在每次迭代应用新的 Servlet 数组后计算完整的映射
- 我使用 _ReadWriteLock_s 所以在更新期间 ServletHandler 将保留新请求直到重新映射完成
上面的函数是从 updateServletHandlerWithDynamicSettings() ServletContextHandlerFactoryComponent class 函数调用的(这是映射、servlet和过滤器根据配置预先收集):https://github.com/everit-org/jetty-server-ecm/blob/master/component/src/main/java/org/everit/jetty/server/ecm/internal/ServletContextHandlerFactoryComponent.java#L86
我想在 servlet 上下文中动态添加和删除 servlet。我知道如何使用 ContextHandlerCollection 动态添加多个 servlet 上下文。但是,我需要对上下文中的多个 servlet 执行相同的操作。一旦 servlet 上下文启动,是否可以添加更多的 servlet?
Servlet 只能添加,不能删除。
查看各种 ServletContext.addServlet()
方法。
但是请注意,您只能在 ServletContextListener.contextInitialized()
期间更改 ServletContext
(请参阅 ServletContext.addServlet()
中的 javadoc 了解 UnsupportedOperationException
可抛)
几年前我确实在 ECM 组件中实现了它,因此可以通过 ConfigAdmin 设置添加和删除 servlet,而无需在 OSGi 环境中重新启动 Jetty 本身。
因为是两年多前的事了,记不太清楚了,大家可以自己去查代码。请参阅 CustomServletHandler class 的 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 subclass 中,我设置了一个标志 ignoreUpdateMapping,同时我再次更新所有映射,否则父 class 将在每次迭代应用新的 Servlet 数组后计算完整的映射
- 我使用 _ReadWriteLock_s 所以在更新期间 ServletHandler 将保留新请求直到重新映射完成
上面的函数是从 updateServletHandlerWithDynamicSettings() ServletContextHandlerFactoryComponent class 函数调用的(这是映射、servlet和过滤器根据配置预先收集):https://github.com/everit-org/jetty-server-ecm/blob/master/component/src/main/java/org/everit/jetty/server/ecm/internal/ServletContextHandlerFactoryComponent.java#L86