为Jersey注册上下文监听器

3

在关闭Jersey服务器后,我需要执行一些清理步骤。我认为可以通过实现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());

MyServerConfig是从ResourceConfig子类化而来,并使用各种register方法。我也想通过编程方式添加监听器,但调用register似乎不能完成该工作。有什么建议可以解决这个问题吗?

1个回答

1

首先,您需要将Grizzly配置为Servlet容器。这不是默认行为。您只是创建了一个HTTP服务器。因此,您需要的第一件事是Grizzly servlet依赖项。

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

这里是相关内容的解释。使用这个工件时,你需要使用 GrizzlyWebContainerFactory 替代 Grizzly HttpServerGrizzlyHttpServerFactory。唯一的问题是,如果你查看工厂 API 方法,实际上没有地方可以注册任何监听器,并且经过我的测试,@WebListener 注释不会自动被捕获。我们需要访问 Grizzly WebAppContext,Jersey 使用它来创建 Grizzly servlet 容器。
我能让它工作的方法,就是从GrizzlyWebContainerFactory.create源代码中获取一些代码,然后自己创建容器。这不需要太多的代码。大部分源代码都进行了检查,以便于实现通用性。但在单个使用情况下(没有初始化参数),你可以将代码减少到这个程度。
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并监听销毁事件,在那里处理所有操作。

我使用了一个事件监听器来解决我遇到的问题。但是使用Grizzly作为ServletContainer也可能起作用... - hfhc2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接