Java 在代理的activemq网络中禁用jmx(spring、xbean)
由于我一直在努力解决这个问题,我现在发布我的解决方案。 在代理的activemq网络中禁用jmx将删除有关注册jmx连接器的争用条件。在同一台计算机上启动多个activemq服务器时: 无法启动jmx连接器:无法绑定到URL[rmi://localhost:1099/jmxrmi]:javax.naming.NameAlreadyBoundException:jmxrmi[根异常为java.rmi.AlreadyBoundException:jmxrmi] 这方面的另一个问题是,即使您没有造成竞争条件,此异常仍然可能发生。即使在启动一个又一个代理,同时等待它们在其间正确初始化时也是如此。如果一个进程由root作为第一个实例运行,另一个作为普通用户运行,那么用户进程会尝试注册自己的jmx连接器,尽管已经有一个 或者当成功注册jmx连接器的代理发生故障时发生的另一个异常: 无法启动jmx连接器:无法绑定到URL[rmi://localhost:1099/jmxrmi]:javax.naming.ServiceUnavailableException[根异常为java.rmi.ConnectException:拒绝连接到主机:localhost;嵌套异常为:java.net.ConnectException:拒绝连接] 这些例外情况导致经纪人网络停止工作,或根本不工作。 禁用jmx的诀窍是,在connectionfactory中也必须禁用jmx。 文档中没有明确说明需要这样做。因此,我不得不挣扎了两天,直到找到解决方案:Java 在代理的activemq网络中禁用jmx(spring、xbean),java,spring,activemq,jmx,Java,Spring,Activemq,Jmx,由于我一直在努力解决这个问题,我现在发布我的解决方案。 在代理的activemq网络中禁用jmx将删除有关注册jmx连接器的争用条件。在同一台计算机上启动多个activemq服务器时: 无法启动jmx连接器:无法绑定到URL[rmi://localhost:1099/jmxrmi]:javax.naming.NameAlreadyBoundException:jmxrmi[根异常为java.rmi.AlreadyBoundException:jmxrmi] 这方面的另一个问题是,即使您没有造成竞
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.3.1.xsd">
<!-- Spring JMS Template -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory" />
</bean>
<!-- Caching, sodass das jms template überhaupt nutzbar ist in sachen performance -->
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory" />
<property name="exceptionListener" ref="jmsExceptionListener" />
<property name="sessionCacheSize" value="1" />
</bean>
<!--
Jeder Client verbindet sich mit seinem eigenen broker, broker sind untereinander vernetzt. Nur wenn hier
nochmals jmx deaktiviert wird, bleibt es auch deaktiviert...
-->
<amq:connectionFactory id="amqConnectionFactory" brokerURL="vm://broker:default?useJmx=false" />
<!--
Broker suchen sich einen eigenen Port und sind gegenseitig verbunden, ergeben dadurch ein Grid. Dies zwar etwas
langsamer, aber dafür ausfallsicherer. Siehe http://activemq.apache.org/networks-of-brokers.html
-->
<amq:broker useJmx="false" persistent="false">
<!-- Wird benötigt um JMX endgültig zu deaktivieren -->
<amq:managementContext>
<amq:managementContext connectorHost="localhost" createConnector="false" />
</amq:managementContext>
<!-- Nun die normale Konfiguration für Network of Brokers -->
<amq:networkConnectors>
<amq:networkConnector networkTTL="1" duplex="true" dynamicOnly="true" uri="multicast://default" />
</amq:networkConnectors>
<amq:persistenceAdapter>
<amq:memoryPersistenceAdapter />
</amq:persistenceAdapter>
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default" />
</amq:transportConnectors>
</amq:broker>
</beans>
这样,就不需要为jvm指定-Dcom.sun.management.jmxremote=false。这对我来说也不起作用,因为connectionfactory启动了jmx连接器
编辑:
Tony的回答让我重新思考了配置,我发现了一个简单的版本,它也可以工作
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.3.2.xsd">
<!-- Caching, sodass das jms template überhaupt nutzbar ist in sachen performance -->
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory" />
<property name="exceptionListener" ref="jmsExceptionListener" />
<property name="sessionCacheSize" value="1" />
</bean>
<!--
Jeder Client verbindet sich mit seinem eigenen broker, broker sind untereinander vernetzt. Nur wenn hier nochmals jmx
deaktiviert wird, bleibt es auch deaktiviert...
-->
<amq:connectionFactory id="amqConnectionFactory" brokerURL="vm://default?broker.persistent=false" />
<!--
Broker suchen sich einen eigenen Port und sind gegenseitig verbunden, ergeben dadurch ein Grid. Dies zwar etwas
langsamer, aber dafür ausfallsicherer. Siehe http://activemq.apache.org/networks-of-brokers.html
-->
<amq:broker useJmx="false" persistent="false">
<amq:networkConnectors>
<amq:networkConnector networkTTL="1" conduitSubscriptions="true" duplex="true" dynamicOnly="true"
uri="multicast://default" />
</amq:networkConnectors>
<amq:persistenceAdapter>
<amq:memoryPersistenceAdapter />
</amq:persistenceAdapter>
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default" />
</amq:transportConnectors>
</amq:broker>
vm://URI连接到一个代理,该代理的brokerName属性与URI中使用的属性匹配,否则它将启动一个名为than的嵌入式代理。因此,您可以同样轻松地设置
vm://foo
where
有时可能存在争用条件,即工厂在代理之前启动,然后启动嵌入式实例(请参阅)htp://activemq.apache.org/vm-transport-reference.html). 您可以通过在ConnectionFactory的Springbean配置中使用dependen-on属性来解决这个问题。可以向代理URL传递额外的参数,如
vm://localhost?broker.persistent=false&broker.useJmx=false
broker.useJmx=false就可以了。如果您得到SAXParseException--“对实体的引用”broker.useJmx“必须以“;”分隔符结尾,然后使用&;而不是&--vm://localhost?broker.persistent=false&;broker.useJmx=false