我有一个在单个Tomcat 7实例上运行的Spring应用程序A,B和C.
A只是切入点,依赖于B& C功能。 B和C通过rmi公开他们的服务bean。 将来会有更多的应用程序,如B和C(D,E ......)。
目前,rmi注册表是由A通过
的上下文加载器加载启动的 <bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
<property name="port" value="${batch.rmi.port}"/>
</bean>
<bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="registry">
<property name="objectName" value="connector:name=rmi"/>
<property name="serviceUrl" value="service:jmx:rmi://localhost:${batch.rmi.port}"/>
</bean>
我的问题是当A重新启动时,rmi注册表也会重新启动并且B&amp; C在注册表中丢失了他们的条目此外,在服务器重启时,我无法保证A将在B&amp; B之前加载。 C(到目前为止还可以......由于命名顺序?)。
我无法提及〜在server.xml中设置一些监听器,以便在服务器启动时加载注册表。所有google对我来说都是启动jmx的JmxRemoteLifecycleListener - 其中我不想运行(在我的情况下不鼓励远程配置)。
编辑#1
显然我可以通过org.apache.catalina.mbeans.ServerLifecycleListener加载的MBean来实现这一目标...最多6个,从7开始删除。
编辑#2
初始临时解决方案是重启后手动重启失败的应用程序。 当前临时解决方案是专用应用程序(仅限rmi上下文),其具有路径&#34; a ...&#34; (我猜一些符号/数字会更合适),以便Tomcat首先加载它。不漂亮,但现在有效 - 直到有更多&#34; a ...&#34;应用程序或tomcat行为在下次更新时会更改。
编辑#3
B&amp; C曝光为
<bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
<property name="host" value="${batch.rmi.host}"/>
<property name="port" value="${batch.rmi.port}"/>
</bean>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="ExampleBatchJob"/>
<property name="service" ref="jobLauncherController"/>
<property name="serviceInterface" value="org.example.IJobLauncherController"/>
<property name="registry" ref="registry"/>
</bean>
当指定host参数时,app会查找注册表,如果找不到,则永远不会尝试创建。解决问题的另一种方法是没有RmiRegistryFactoryBean设置为&#34;查找注册表,如果找不到则启动一个&#34; - &gt;我的误解,由aecolley解释。
答案 0 :(得分:1)
通过用depends-on
将RMIRegistry挂钩到A(以及其他任何东西),你可以确保在销毁A之后不久就会销毁RMIRegistry。 (见Spring docs。)
如果找不到一个注册表,RmiRegistryFactoryBean确实有一个设置来创建一个注册表:只需省略host
属性。但是,如果可能的话,我建议让所有使用注册表的应用程序依赖于depends-on
的同一个注册表,以消除有关首先启动哪个应用程序的随机性。