关闭球衣服务器后,我需要执行一些清理步骤。在我看来,这可以通过实现ServletContextListener轻松实现。当然,问题是如何将此侦听器添加到应用程序中。我已经看到了在web.xml文件中完成此操作的示例,如下所示:

<listener>
  <listener-class>org.SomeCompany.SomePackage.server.MyListener</listener-class>
</listener>
MyListener类的外观如下:
@WebListener
public class MyListener implements ServletContextListener {

问题在于该方法仅适用于作为战争文件进行部署。但是,我也将软件作为独立的jar文件提供,该文件创建了一个Grizzly Web服务器来部署servlet:
HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(BASE_URI,
                new MyServerConfig());
MyServerConfig类是ResourceConfig的子类,并使用各种register方法。我也想以编程方式添加侦听器,但是调用register似乎没有完成这项工作。任何想法如何解决这一问题?

最佳答案

首先需要将Grizzly配置为servlet容器。这不是默认行为。您仅在创建HTTP服务器。因此,您需要做的第一件事就是Grizzly servlet依赖关系

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-grizzly2-servlet</artifactId>
    <version>${jersey2.version}</version>
</dependency>

因此,这就是处理方法。有了此工件,您可以使用 HttpServer 代替带有GrizzlyHttpServerFactory的Grizzly 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));
顺便说一句,对于您的用例(我只是重新阅读了问题:-),Jersey也有Event Listeners。您可以编写一个ApplicationEventListener并侦听destroy事件,然后在那里进行所有处理。

关于java - 注册 Jersey 的上下文监听器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35871573/

10-13 04:11