我需要在关闭球衣服务器后执行一些清理步骤。在我看来,这可以通过实施ServletContextListener轻松完成。问题当然是如何将此侦听器添加到应用程序中。我已经看到了在文件web.xml
中完成此操作的示例:
<listener>
<listener-class>org.SomeCompany.SomePackage.server.MyListener</listener-class>
</listener>
MyListener
类如下所示:
@WebListener
public class MyListener implements ServletContextListener {
问题是这种方法仅适用于作为war文件的部署。但是,我也将我的软件作为独立的jar文件发布,它创建了一个Grizzly Web服务器来部署servlet:
HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(BASE_URI,
new MyServerConfig());
来自ResourceConfig的类MyServerConfig
子类,并使用各种register
方法。我想以编程方式添加侦听器,但调用register
似乎不能完成这项工作。任何想法如何解决这个问题?
答案 0 :(得分:1)
首先,您需要将Grizzly配置为servlet容器。这不是默认行为。您只是在创建HTTP服务器。所以你需要的第一件事是Grizzly servlet依赖
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-servlet</artifactId>
<version>${jersey2.version}</version>
</dependency>
所以这是与此相关的交易。使用此工件,而不是使用HttpServer
的Grizzly GrizzlyHttpServerFactory
,而是使用GrizzlyWebContainerFactory
。唯一的问题是,如果您查看工厂API方法,实际上没有地方可以注册任何侦听器,而且根据我的测试,@WebListener
注释不会自动被拾取。我们需要访问的是Jersey用来创建Grizzly servlet容器的Grizzly WebAppContext
。
我能够让它工作的方式只是从GrizzlyWebContainerFactory.create
source code中获取一些代码,然后自己创建容器。这真的不是很多代码。大多数源代码都需要进行检查,因为它需要通用。但是在一个用例中(没有init-params),你几乎可以将代码剪切到这个
private static HttpServer create(URI u, Servlet servlet) throws IOException {
String path = u.getPath();
path = String.format("/%s", UriComponent.decodePath(u.getPath(), true)
.get(1).toString());
WebappContext context = new WebappContext("GrizzlyContext", path);
context.addListener(MyListener.class);
ServletRegistration registration;
registration = context.addServlet(servlet.getClass().getName(), servlet);
registration.addMapping("/*");
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(u);
context.deploy(server);
return server;
}
然后只需致电HttpServer server = create(BASE_URI, new ServletContainer(resourceConfig));
顺便说一句,对于你的用例(我只是重新阅读问题:-),泽西岛也有Event Listeners。您可以编写ApplicationEventListener
并监听destroy事件,并在那里进行所有处理。