2013-10-30 6 views
3

응용 프로그램이 종료되면 정리 작업을 수행해야하는 JAX-RS 응용 프로그램을 실행하고 있습니다. 이 목적을 위해 종료 후크를 설치했는데 정상적으로 작동합니다. 그러나 단위 테스트에서 JVM이 두 번의 호출 사이에서 종료되지 않기 때문에 (물론) 셧다운 훅이 트리거되지 않습니다. 이 문제를 해결하고 최후의 수단으로 셧다운 훅을 사용하고 싶습니다. 상상해보십시오. 명시 적으로 종료를 트리거하지 않고 서블릿 컨테이너에서 응용 프로그램을 배포 취소하는 경우에도 마찬가지입니다. 또한 응용 프로그램 컨테이너가 계속 종료 되어도 응용 프로그램 컨테이너가 계속 실행되는 경우 메모리 누수가 발생할 수 있다고 생각합니까?JAX-RS 배포 해제를 청취하는 방법

질문 : : 내 JAX-RS 응용 프로그램을 담당하는 서버/서블릿을 폐기 할 수 있습니까? 나는 Servlet#destroy 메서드와 같은 것을 생각하고있었습니다.

new ResourceConfig().register(new MyShutDownListener()) 또는 내가 할 수있는 일이 ShutDownBinder입니까? 어떤 아이디어?

+0

'ServletContextListener.contextDestroyed()'메소드가 당신의 케이스에 적합하지 않습니까? –

+0

'GrizzlyHttpServerFactory' (https://jersey.java.net/apidocs/latest/jersey/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpServerFactory.html)에 의해 임베디드 된 응용 프로그램을 시작할 것입니다. 나는 그 일에 매달릴 길을 찾지 못했습니다. –

답변

3

음, 나는 org.glassfish.jersey.server.spi.ContainerLifecycleListener 인터페이스를 발견했습니다. 내 인터페이스가 v2.1을 사용하는 동안이 인터페이스가 v2.3에서 Jersey로가는 길을 찾은 것처럼 보입니다. 이제 저지를 업그레이드하고 행복하게 사용합니다. (이것은 Jersey-RS의 형제가 아니기 때문에 JAX-RS에는 형제가 없습니다.)

이 답변의 향후 독자를위한 옵션이 아니면 GrizzlyWebContainerFactory을 사용하여 다른 해결책을 찾았습니다. 응용 프로그램을 시작하기위한 내 자신의 서블릿을 정의하십시오. 그러나이 솔루션은 더 길었습니다.

+0

이 인터페이스를 사용하면 마침내 설명 된 문제를 해결하는 데 도움이되었습니다. [여기] (http://jersey.576304.n2.nabble.com/What-is-the-properway-of-cleaning-up-asynchronous-requests- before-servlet-redeploy-Jersey-Tomcat-td7583818.html)은 애플리케이션이 종료 될 때 열려있는 AsyncResponse를 취소하여 더 이상 상호 작용할 수 없도록합니다. '@ PreDestroy','ServletContextListener' 또는'@Observes @Destroyed (ApplicationScoped.class)'와 같은 다른 모든 가능성은 작동하지 않았습니다. –

관련 문제