1

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

此应用程序还需要公开一个服务以通过 RMI 进行远程访问。我正在使用 SpringRmiServiceExporter来执行此操作:

<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 进程。这似乎是因为我应该明确地关闭(即调用close()方法)创建的上下文RmiServiceExporter,在这种情况下是我的应用程序上下文(而不是 Web 上下文)。(来源:https ://issues.springsource.org/browse/SPR-5601 )

如何close()在 webapp 中实现这一点(在应用程序停止时调用上下文上的方法),其中上下文由ServletContextListener( org.springframework.web.context.ContextLoaderListener) 创建?

编辑:我的问题实际上被误导了。上下文实际上已经被关闭,RmiServiceExporter 的 destroy() 方法也是如此。问题(tomcat 无法正常关闭)似乎来自其他问题。愿花时间回答这个问题的用户原谅我匆忙发布它。

4

2 回答 2

0

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>

2)如果您有指向上下文实例的链接,请添加关闭挂钩

context.registerShutdownHook();
于 2013-06-14T07:59:03.970 回答
0

尝试使用 ContextLoaderListener 来启动您的应用程序上下文,如此所述。它应该会自动为您关闭上下文。

于 2013-06-14T08:22:04.310 回答