2010-03-27 178 views
13

由於我在這個問題上遇到了很多困難,我發佈了我的解決方案。 在代理的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> 

回答

2

在VM:// URI連接到一個代理,其brokerName屬性匹配的URI中所使用的一個,否則它啓動一個嵌入一個具有比名稱。所以你可以輕鬆設置vm://foo,其中<amq:broker brokerName="foo"/>

有時可能存在競爭條件,工廠在代理之前啓動,然後啓動嵌入式實例(請參閱htp://activemq.apache.org/vm-transport-reference.html)。你可以通過在ConnectionFactory的Spring bean配置中使用depends-on屬性來解決這個問題。

9

這是可能的附加參數傳遞給經紀人URL,像

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

broker.useJmx = false將做的伎倆。

+1

如果得到SAXParseException - 「對實體的引用」代理。useJmx「必須以';'結尾分隔符「,然後使用_ & _而不是_&_ - ** vm:// localhost?broker.persistent = false & broker.useJmx = false ** – 2016-03-22 05:48:07

相關問題