Como he tenido problemas con este problema, estoy publicando mi solución. La desactivación de jmx en una red activemq de intermediarios elimina las condiciones de carrera sobre el registro del conector jmx. Al iniciar varios servidores ActiveMQ en la misma máquina:Desactivar jmx en la red de corredores activemq (spring, xbean)
No se pudo iniciar el conector JMX: No se puede enlazar a la URL [RMI: // localhost: 1099/jmxrmi]: javax.naming.NameAlreadyBoundException: jmxrmi [excepción de la raíz es java .rmi.AlreadyBoundException: jmxrmi]
Otro problema con esto es que, incluso si no causa una condición de carrera, esta excepción aún puede ocurrir. Incluso cuando se inicia un intermediario después de otro mientras se espera que se inicialicen correctamente en el medio. Si un proceso es ejecutado por root como la primera instancia y el otro como un usuario normal, de alguna manera el proceso del usuario intenta registrar su propio conector jmx, aunque ya existe uno.
O otra excepción que ocurre cuando el agente que ha registrado correctamente el conector JMX baja:
Error al iniciar el conector JMX: No se puede enlazar a la URL [RMI: // localhost: 1099/jmxrmi]: javax .naming.ServiceUnavailableException [La excepción de raíz es java.rmi.ConnectException: Connection se negó a alojar: localhost; excepción anidada es: java.net.ConnectException: conexión rechazada]
Esas excepciones hacen que la red de intermediarios deje de funcionar o no funcione en absoluto. El truco para deshabilitar jmx era que jmx también tenía que estar deshabilitado en la fábrica de conexión. La documentación http://activemq.apache.org/jmx.html no dice que esto sea necesario explícitamente. Así que tuve que luchar durante 2 días hasta que encontré la solución:
<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>
Con esto, no hay necesidad de especificar -Dcom.sun.management.jmxremote = false para la JVM. Que de alguna manera tampoco funcionó para mí, porque connectionfactory inició el conector jmx.
Editar:
respuesta Tonys me llevó a repensar la configuración y encontré una versión simplificada que funciona también.
<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>
Si obtiene SAXParseException - "La referencia a la entidad" corredor.useJmx "debe terminar con ';' delimiter. ", luego use _ & _ en lugar de _ & _ - ** vm: // localhost? broker.persistent = false & broker.useJmx = false ** –