Поскольку я много боролся с этой проблемой, я отправляю свое решение. Отключение jmx в сети посредников activemq устраняет условия гонки, связанные с регистрацией соединителя jmx. При запуске нескольких серверов ActiveMQ на той же машине:Отключить jmx в сети активных брокеров (весна, xbean)
Не удалось запустить JMX разъем: Невозможно привязать к URL [RMI: // локальный: 1099/jmxrmi]: javax.naming.NameAlreadyBoundException: jmxrmi [исключение Корень Java .rmi.AlreadyBoundException: jmxrmi]
Другая проблема заключается в том, что даже если вы не вызываете состояние гонки, это исключение все еще может произойти. Даже при запуске одного брокера за другим, ожидая их правильной инициализации между ними. Если один процесс запускается как первый экземпляр, а другой - как обычный пользователь, пользовательский процесс пытается зарегистрировать свой собственный jmx-коннектор, хотя он уже есть.
Или другое исключение, которое происходит, когда брокер, который успешно зарегистрирован разъем JMX идет вниз:
Не удалось запустить JMX разъем: Невозможно привязать к URL [RMI: // Localhost: 1099/jmxrmi]: javax .naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: подключение отказалось от хоста: localhost; вложенное исключение: java.net.ConnectException: Соединение отклонено]
Эти исключения вызывают сеть брокеров, чтобы перестать работать или не работать вообще. Уловкой для отключения jmx было то, что jmx пришлось отключить и в connectionfactory. В документации 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-коннектор.
Edit:
Tonys ответ привел меня к переосмыслению конфигурации и я нашел упрощенную версию, которая работает как хорошо.
<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 ** –