由于我在这个问题上遇到了很多困难,我发布了我的解决方案。 在代理的activemq网络中禁用jmx会删除有关注册jmx连接器的争用条件。当在同一台机器上启动多个ActiveMQ的服务器:在经纪人的activemq网络中禁用jmx(spring,xbean)
无法启动JMX连接:不能结合到URL [RMI://本地主机:1099/jmxrmi]:javax.naming.NameAlreadyBoundException:jmxrmi [根异常是用java .rmi.AlreadyBoundException:jmxrmi]
此问题的另一个问题是,即使您不会导致竞争条件,仍可能发生此异常。甚至当一个接一个的经纪人开始时,等待他们在两者之间正确初始化。如果一个进程由root作为第一个实例运行,另一个作为普通用户运行,用户进程试图注册自己的jmx连接器,尽管已经有一个。
或发生其他异常时成功注册的JMX连接经纪人下降:
无法启动JMX连接器:无法绑定到URL [RMI://本地主机:1099/jmxrmi]:使用javax .naming.ServiceUnavailableException [根异常是java.rmi.ConnectException:连接拒绝主机:localhost;嵌套的异常是:java.net.ConnectException:连接被拒绝]
这些异常会导致代理网络停止工作或根本无法工作。 禁用jmx的技巧是,jmx必须在连接工厂中被禁用。 文档http://activemq.apache.org/jmx.html并没有说明这是明确需要的。所以我不得不奋斗2天,直到我找到了解决办法:
<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>
有了这个,就没有必要指定-Dcom.sun.management.jmxremote =假的JVM。哪种方式也不适合我,因为connectionfactory启动了jmx连接器。
编辑:
东尼斯答案给我带来了重新思考的配置,我发现它的工作原理藏汉的简化版本。
<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>
如果得到SAXParseException - “对实体的引用”代理。useJmx“必须以';'结尾分隔符“,然后使用_ & _而不是_&_ - ** vm:// localhost?broker.persistent = false & broker.useJmx = false ** – 2016-03-22 05:48:07