2010-03-27 3 views
13

Поскольку я много боролся с этой проблемой, я отправляю свое решение. Отключение 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> 

ответ

2

ВМ: // URI подключается к брокеру, чей brokerName атрибута соответствует той, которая используется в URI, в противном случае он начинает внедренный один с чем имя. Таким образом, вы могли бы так же легко настроить vm://foo, где <amq:broker brokerName="foo"/>.

Иногда может быть состояние гонки, когда завод запускается перед брокером и, в свою очередь, запускает внедренный экземпляр (см. Htp: //activemq.apache.org/vm-transport-reference.html). Вы можете обойти это, используя атрибут зависимости в конфигурации SpringFanSoundFactory.

9

Можно передать дополнительный параметр брокера URL, как

vm://localhost?broker.persistent=false&broker.useJmx=false 

broker.useJmx = ложному будет делать трюк.

+1

Если вы получите SAXParseException - брокера «Ссылка на сущность».useJmx "должен заканчиваться символом ';' разделитель. ", затем используйте _ & _ вместо _ & _ - ** vm: // localhost? broker.persistent = false & broker.useJmx = false ** –