当servlet容器关闭时,Jersey 2.3不会调用HK2服务定位器关闭

时间:2013-11-01 21:30:51

标签: jersey shutdown hk2

问题:是否有正确的方法确保HK2与泽西2关闭;如果没有,这会被视为一个错误吗?

使用jersey-server 2.3.1,我注意到没有调用托管单例上的HK2 @PreDestroy方法和dispose()实现上的Factory<T>方法。做了一些探讨,我看到ConfigHelper定义了一个生命周期监听器,它在服务定位器上调用preDestroy(),但仅此而已。这可以从ServletContainershutdown()上的Jersey reload()调用,但在关闭方面没有进一步使用服务定位器。

我查看了ServletContainer,但似乎没有办法通过任何公共或受保护的API访问HK2服务定位器。

3 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。对我来说,解决方案是调用serviceLocator.shutdown()(我不知道为什么在服务关闭时不会自动调用此方法)。调用此方法后,将调用所有dispose()方法。问题哪里是调用serviceLocator.shutdown()的好地方?我实现了ApplicationEventListener,因此服务可以侦听事件DESTROY_FINISHED,RELOAD_FINISHED。当service捕获此事件时,将调用serviceLocator.shutdown()。如果您找到更好的解决方案,请告诉我。

答案 1 :(得分:0)

我最终将ServiceLocator注入我的Application实例(假设这是我应用程序的最顶层ServiceLocator)并在locator.shutdown()中调用MyApplication.preDestroy()(标记为@PreDestroy并从jersey的ContainerLifecycleListener调用)。为我工作好。但不确定这是推荐的做法。

答案 2 :(得分:0)

此问题已在球衣2.7(https://java.net/jira/browse/JERSEY-2299)和球衣2.11(https://java.net/jira/browse/JERSEY-2549)中得到解决。更新您的球衣依赖性应该为您解决问题。