2010-03-27 23 views
13

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> 

Respuesta

2

la máquina virtual: // URI se conecta a un corredor cuya brokerName atributo coincide con la utilizada en el URI, de lo contrario, se inicia otra empotrada con que nombre. Por lo tanto, podría configurar tan fácilmente vm://foo donde <amq:broker brokerName="foo"/>.

A veces puede haber una condición de carrera en la que la fábrica comienza antes que el intermediario y, a su vez, inicia una instancia incrustada (consulte htp: //activemq.apache.org/vm-transport-reference.html). Puede solucionar esto utilizando el atributo dependiente en la configuración de Spring Bean de ConnectionFactory.

9

Es posible pasar parámetros adicionales a la URL del corredor, como

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

broker.useJmx = false hará el truco.

+1

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 ** –

Cuestiones relacionadas