Spring升级后RmiRegistryFactoryBean弃用,ConnectorServerFactoryBean适配方案咨询
问题描述
升级Spring版本后,org.springframework.remoting.rmi.RmiRegistryFactoryBean类已被弃用,当前配置中ConnectorServerFactoryBean依赖该registry实例,需要找到该类的替代方案,或实现不依赖registry创建ConnectorServerFactoryBean。原配置如下:
<bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean" > <property name="port" value="{jmx.port}" /> <property name="clientSocketFactory" ref="sslRMIClientSocketFactory" /> <property name="serverSocketFactory" ref="sslRMIServerSocketFactory" /> </bean> <bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="registry" > <property name="serviceUrl" value="service:jmx:rmi://0.0.0.0:{jmx.port}/jndi/rmi://0.0.0.0:{jmx.port}/drsrmi" /> <property name="environment" > <map> <entry key="jmx.remote.jndi.rebind" value="true"/> <entry key="jmx.remote.tls.need.client.authentication" value="true"/> <entry key="jmx.remote.rmi.server.socket.factory" value-ref="sslRMIServerSocketFactory"/> <entry key="jmx.remote.rmi.client.socket.factory" value-ref="sslRMIClientSocketFactory"/> <entry key="com.sun.jndi.rmi.factory.socket" value-ref="sslRMIClientSocketFactory"/> </map> </property> </bean>
解决方案
方案一:替代RmiRegistryFactoryBean创建RMI注册表
Spring弃用RmiRegistryFactoryBean后,可直接使用JDK原生的java.rmi.registry.LocateRegistry类创建RMI注册表,通过XML的factory-method实现Spring管理:
<!-- 替代原registry bean,使用JDK原生API创建带SSL支持的RMI注册表 --> <bean id="registry" class="java.rmi.registry.LocateRegistry" factory-method="createRegistry"> <constructor-arg value="{jmx.port}" /> <constructor-arg ref="sslRMIClientSocketFactory" /> <constructor-arg ref="sslRMIServerSocketFactory" /> </bean> <!-- ConnectorServerFactoryBean配置保持不变,依然依赖registry实例 --> <bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="registry" > <property name="serviceUrl" value="service:jmx:rmi://0.0.0.0:{jmx.port}/jndi/rmi://0.0.0.0:{jmx.port}/drsrmi" /> <property name="environment"> <map> <entry key="jmx.remote.jndi.rebind" value="true"/> <entry key="jmx.remote.tls.need.client.authentication" value="true"/> <entry key="jmx.remote.rmi.server.socket.factory" value-ref="sslRMIServerSocketFactory"/> <entry key="jmx.remote.rmi.client.socket.factory" value-ref="sslRMIClientSocketFactory"/> <entry key="com.sun.jndi.rmi.factory.socket" value-ref="sslRMIClientSocketFactory"/> </map> </property> </bean>
方案二:不依赖预先创建的RMI注册表
JMX的RMI连接器支持自动创建RMI注册表,只要指定端口未被占用,无需预先定义registry bean,只需移除depends-on="registry"配置即可:
<!-- 移除原registry bean,由JMX连接器自动创建RMI注册表 --> <bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean" > <property name="serviceUrl" value="service:jmx:rmi://0.0.0.0:{jmx.port}/jndi/rmi://0.0.0.0:{jmx.port}/drsrmi" /> <property name="environment"> <map> <entry key="jmx.remote.jndi.rebind" value="true"/> <entry key="jmx.remote.tls.need.client.authentication" value="true"/> <entry key="jmx.remote.rmi.server.socket.factory" value-ref="sslRMIServerSocketFactory"/> <entry key="jmx.remote.rmi.client.socket.factory" value-ref="sslRMIClientSocketFactory"/> <entry key="com.sun.jndi.rmi.factory.socket" value-ref="sslRMIClientSocketFactory"/> </map> </property> </bean>
注意:自动创建注册表时,若指定端口已被占用会抛出绑定异常,需确保端口可用。
内容的提问来源于stack exchange,提问作者SRG
相关产品推荐
相关产品推荐

