Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringWeb应用程序中明确关闭Spring上下文?_Java_Spring_Spring Mvc_Rmi - Fatal编程技术网

Java 如何在SpringWeb应用程序中明确关闭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}"/>

我有一个在Tomcat中运行的Spring webapp

此应用程序还需要公开一个服务,以便通过RMI进行远程访问。我正在使用Spring的
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();