2016-03-08 37 views
2

我需要在关闭球衣服务器之后执行一些清理步骤。在我看来,这可以通过实施ServletContextListener轻松完成。当然,问题是如何将此侦听器添加到应用程序中。我曾经见过这是文件web.xml中做过这样的例子:登录球衣的上下文监听器

<listener> 
    <listener-class>org.SomeCompany.SomePackage.server.MyListener</listener-class> 
</listener> 

其中MyListener类如下所示:

@WebListener 
public class MyListener implements ServletContextListener { 

的问题是,这种方法仅适用于部署战文件。但是,我还附带了软件为它创建了一个灰熊的Web服务器来部署servlet的独立jar文件:

HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, 
       new MyServerConfig()); 

MyServerConfig子从ResourceConfig并使用各种register方法。我想以编程方式添加侦听器,但调用register似乎没有完成这项工作。任何想法如何解决这一问题?

回答

1

的第一件事,你要需要灰熊配置为一个servlet容器。这不是默认行为。你只是在创建一个HTTP服务器。所以,你需要的第一件事就是灰熊的servlet依赖

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

所以这里的交易与此有关。有了这个神器,而不是灰熊HttpServerGrizzlyHttpServerFactory,你会改为使用GrizzlyWebContainerFactory。唯一的问题是,如果您查看工厂API方法,实际上没有注册任何监听器的地方,并且从我测试的内容来看,注释不会自动获取。我们需要访问的是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并收听销毁事件,并在那里进行所有处理。

+0

我确实去了一个事件监听器,它解决了我遇到的问题。但是将grizzly作为ServletContainer使用也是可行的... – hfhc2