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

Spring Tomcat 7启动类或侦听器设置(启动RMI注册表),spring,tomcat,rmi,Spring,Tomcat,Rmi,我有spring应用程序A、B和C,它们在一个Tomcat7实例上运行 A是唯一的入口点,依赖于B&C功能。B和C通过rmi公开他们的服务bean。 将来会有更多像B和C(D,E…)这样的应用程序 此时,rmi注册表由通过的上下文加载程序加载的启动 <bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"> <property name="port" val

我有spring应用程序A、B和C,它们在一个Tomcat7实例上运行

A是唯一的入口点,依赖于B&C功能。B和C通过rmi公开他们的服务bean。 将来会有更多像B和C(D,E…)这样的应用程序

此时,rmi注册表由通过的上下文加载程序加载的启动

  <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&C会丢失注册表中的条目。此外,在服务器重启时,我不能保证A会在B&C之前加载(到目前为止还可以……因为命名顺序?)

我找不到关于在server.xml中设置某个侦听器以便在服务器启动时加载注册表的内容。google为我提供的只是启动jmx的JmxRemoteLifecycleListener,我不想运行它(在我的情况下,不建议使用远程配置)

编辑#1

显然,我可以通过org.apache.catalina.mbeans.ServerLifecycleListener加载的MBean来实现这一点。。。从7降到6

编辑#2

最初的临时解决方案是在重新启动后手动重新启动失败的应用程序。 当前的临时解决方案是专用的应用程序(仅限rmi上下文),它有路径“a…”(我想一些符号/数字更合适),以便Tomcat首先加载它。虽然不漂亮,但暂时可以用——直到下一次更新中有更多的“a…”应用程序或tomcat行为改变

编辑#3

B&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>


指定主机参数后,应用程序将查找注册表,如果找不到,则从不尝试创建。解决这个问题的另一种方法是,没有设置RmiRegistryFactoryBean“查找注册表,如果找不到就启动一个”->我的误解,aecolley解释道。

将RMIRegistry挂接到一个(
依赖于)
,而没有其他设置,您正在确保RMI注册表将在A被销毁后不久被销毁。(见附件。)


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

B和C是否也声明了
依赖于=“注册表”
?还有其他类型的生命周期侦听器,事实上你可以自己编写,当然,您的解决方案是特定于Tomcat的。@aecolley添加了编辑#3@EJP标题有点变了。我的问题是谷歌这次让我失望了,因为我找不到一个极简主义的例子,你不需要一个“极简主义的例子”。您所需要的只是接口定义。只要实现这些方法。我还没看过,但我准备打赌只有两种方法,一种是启动方法,一种是停止方法。这并不难。是的,不知怎的,我没能意识到注册表是停留在应用程序上下文中的(~不是服务器的),所以它被销毁了。这让我陷入了这样的想法:当A重新启动时出现“重复”初始化时,注册表仍然处于活动状态。意识到我需要检查一些东西…我删除了“解决问题的alt方法”-单个注册表可通过应用程序0使用(“编辑#2中的“当前临时解决方案”)。是否有其他方法从多个应用程序引用注册表。。。服务器上的共享全局上下文?由于重新部署等原因,允许任何应用程序在其上下文中使用它是不合适的。我不确定是否可以如此轻松地声明应用程序之间的依赖关系。坦白地说,我只是启动一个独立的RMI注册表并让它运行。因此,让注册表运行的方法是一个原始问题。由于环境的原因,独立可能很棘手。