Java 如何在SpringWeb应用程序中明确关闭Spring上下文?
我有一个在Tomcat中运行的Spring webapp 此应用程序还需要公开一个服务,以便通过RMI进行远程访问。我正在使用Spring的Java 如何在SpringWeb应用程序中明确关闭Spring上下文?,java,spring,spring-mvc,rmi,Java,Spring,Spring Mvc,Rmi,我有一个在Tomcat中运行的Spring webapp 此应用程序还需要公开一个服务,以便通过RMI进行远程访问。我正在使用Spring的RmiServiceExporter来执行以下操作: <bean class="org.springframework.remoting.rmi.RmiServiceExporter"> <property name="serviceName" value="${server.rmi.remoteServiceName}"/>
RmiServiceExporter
来执行以下操作:
<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>
它工作得很好,但是当我关闭Tomcat时,它会挂起,我必须先杀死它,然后手动杀死它为RMI注册表创建的Java进程。这似乎是因为我应该在创建RmiServiceExporter
的上下文上明确地关闭(即调用close()
方法),在本例中是我的应用程序上下文(而不是web上下文)。(来源:)
如何在webapp中实现这一点(在应用程序停止时调用上下文上的close()
方法),其中上下文由ServletContextListener
(org.springframework.web.context.ContextLoaderListener
)创建
编辑:我的问题实际上被误导了。上下文实际上已经被关闭,RmiServiceExporter的destroy()方法也被关闭。问题(tomcat无法正常关机)似乎来自其他方面。请花时间询问此问题的用户原谅我匆忙发布此问题。1)将destroy方法添加到bean定义中:
<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>
如前所述,尝试使用ContextLoaderListener启动应用程序上下文。它应该会自动为您关闭上下文。RmiServiceExporter实现DisposableBean,因此不需要提供销毁方法。没错。已调用导出程序的destroy()方法。请参阅我对问题的编辑。我已经在使用org.springframework.web.context.ContextLoaderListener,但它似乎没有关闭上下文。。。或者是这样,问题出在别的地方。我会调查的。你试过调试它吗?destroy()方法中有一些try/catch。您还可以使用jVisualVM对其进行分析,并找出VM未关闭的原因。您是否可以分享导致初始问题的原因(tomcat未正确关闭)及其解决方案。(目前我也面临着类似的问题)@Akash:对不起,那是很久以前的事了,我不记得了。但与RMI无关。
context.registerShutdownHook();