2013-06-14 1 views
1

Tomcat에서 실행되는 Spring webapp가 있습니다.Spring 웹 애플리케이션에서 Spring 컨텍스트를 명시 적으로 닫는 방법은 무엇입니까?

또한이 응용 프로그램은 RMI를 통한 원격 액세스 서비스를 제공해야합니다.

<bean class="org.springframework.remoting.rmi.RmiServiceExporter"> 
    <property name="serviceName" value="${server.rmi.remoteServiceName}"/> 
    <property name="service" ref="remoteFacade"/> 
    <property name="serviceInterface" value="my.ServiceInterface"/> 
    <!-- defaults to 1099 --> 
    <property name="registryPort" value="${server.rmi.registryPort}"/> 
</bean> 

그것은 잘 작동하지만 종료 톰캣, 그것은 중단하고 나는 그것을 죽이고 수동으로는 RMI 레지스트리에 대해 생성 한 자바 프로세스를 종료 할 때 나는이 작업을 수행하는 봄의 RmiServiceExporter을 사용하고 있습니다. RmiServiceExporter을 만든 컨텍스트 (이 경우 웹 컨텍스트가 아닌)에 명시 적으로 닫아야합니다 (즉, close() 메서드를 호출해야합니다). (소스 : https://issues.springsource.org/browse/SPR-5601)

방법 (응용 프로그램이 중단되는 경우에 컨텍스트 close() 메소드를 호출)이 달성 상황이 ServletContextListener (org.springframework.web.context.ContextLoaderListener)에 의해 생성되는 웹 애플리케이션에서?

편집 : 제 질문은 실제로 오도되었습니다. 컨텍스트는 실제로 이미 닫혀 있으며 RmiServiceExporter의 destroy() 메서드도 마찬가지입니다. 문제 (제대로 종료 할 수없는 바람둥이)는 다른 것에서 오는 것 같습니다. 이 질문을 던지면서 시간을 보낸 사용자가 게시를 서둘러 용서해 주시기 바랍니다.

+0

초기 문제의 원인을 알려주십시오. (톰캣이 제대로 종료되지 않음) 해결책입니다. (현재 비슷한 문제에 직면하고 있습니다.) –

+0

@Akash : 오래 전 죄송합니다. 기억이 안납니다. RMI와 관련이 없다. –

답변

0

1) 빈 정의에 방법을 파괴 추가

<bean class="org.springframework.remoting.rmi.RmiServiceExporter" destroy-method="destroy"> 
    <property name="serviceName" value="${server.rmi.remoteServiceName}"/> 
    <property name="service" ref="remoteFacade"/> 
    <property name="serviceInterface" value="my.ServiceInterface"/> 
    <!-- defaults to 1099 --> 
    <property name="registryPort" value="${server.rmi.registryPort}"/> 
</bean> 

2) 당신이로의 ContextLoaderListener를 사용하여 응용 프로그램 컨텍스트를 시작하는 종료 후크를

context.registerShutdownHook(); 
+2

RmiServiceExporter는 DisposableBean을 구현하므로 IMHO에서는 destroy 메소드를 제공 할 필요가 없습니다. – Behnil

+0

맞습니다. 수출업자의 destroy() 메소드가 이미 호출 중입니다. 질문에 대한 내 편집을보십시오. –

0

시도를 추가 컨텍스트 인스턴스에 대한 링크가있는 경우 상기 here을 기재한다. 자동으로 컨텍스트를 닫아야합니다.

+0

나는 이미 org.springframework.web.context.ContextLoaderListener를 사용하고 있지만 문맥을 닫지 않는 것처럼 보입니다 ... 아니면 어쩌면 문제가 다른 곳에서 발생합니다. 나는 그것을 들여다 볼 것이다. –

+0

디버깅을 시도 했습니까? destroy() 메소드에는 try/catch가 있습니다. 또한 jVisualVM을 사용하여 프로필을 작성하고 VM 종료가 아닌 이유를 확인할 수 있습니다. – Behnil