Tomcat 7启动类或监听器设置(启动RMI注册表)

时间:2014-08-22 10:30:53

标签: spring tomcat rmi

我有一个在单个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解释。

1 个答案:

答案 0 :(得分:1)

通过用depends-on将RMIRegistry挂钩到A(以及其他任何东西),你可以确保在销毁A之后不久就会销毁RMIRegistry。 (见Spring docs。)

如果找不到一个注册表,RmiRegistryFactoryBean确实有一个设置来创建一个注册表:只需省略host属性。但是,如果可能的话,我建议让所有使用注册表的应用程序依赖于depends-on的同一个注册表,以消除有关首先启动哪个应用程序的随机性。