java – 在activemq网络中禁用jmx(spring,xbean)

前端之家收集整理的这篇文章主要介绍了java – 在activemq网络中禁用jmx(spring,xbean)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
由于我在这个问题上遇到了很多困难,所以我发布了我的解决方案.
在经纪人的activemq网络中禁用jmx可以消除有关jmx连接器注册的竞争条件.在同一台机器上启动多个activemq服务器时:

Failed to start jmx connector: Cannot bind to URL [rmi://localhost:1099/jmxrmi]: javax.naming.NameAlreadyBoundException: jmxrmi [Root exception is java.rmi.AlreadyBoundException: jmxrmi]

另一个问题是,即使不引起竞争条件,这个异常仍然可以发生.即使在等待他们在两者之间正确初始化的同时开始一个经纪人.如果一个进程由root作为第一个实例运行,另一个进程作为普通用户运行,用户进程尝试注册自己的jmx连接器,尽管已经有一个.

或者当成功注册jmx连接器的代理关闭时发生的另一个异常:

Failed to start jmx connector: Cannot bind to URL [rmi://localhost:1099/jmxrmi]: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: java.net.ConnectException: Connection refused]

这些例外导致经纪人网络停止工作,或者根本不工作.
禁用jmx的技巧是,jmx必须在连接失败中被禁用.
文档http://activemq.apache.org/jmx.html并不表示明确地需要这样做.所以我不得不奋斗了2天,直到找到解决方案:

  1. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.apache.org/schema/core"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.springframework.org/schema/beans
  4. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://activemq.apache.org/schema/core
  5. http://activemq.apache.org/schema/core/activemq-core-5.3.1.xsd">
  6.  
  7. <!-- Spring JMS Template -->
  8. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  9. <constructor-arg ref="connectionFactory" />
  10. </bean>
  11.  
  12. <!-- Caching,sodass das jms template überhaupt nutzbar ist in sachen performance -->
  13. <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
  14. <constructor-arg ref="amqConnectionFactory" />
  15. <property name="exceptionListener" ref="jmsExceptionListener" />
  16. <property name="sessionCacheSize" value="1" />
  17. </bean>
  18.  
  19. <!--
  20. Jeder Client verbindet sich mit seinem eigenen broker,broker sind untereinander vernetzt. Nur wenn hier
  21. nochmals jmx deaktiviert wird,bleibt es auch deaktiviert...
  22. -->
  23. <amq:connectionFactory id="amqConnectionFactory" brokerURL="vm://broker:default?useJmx=false" />
  24.  
  25. <!--
  26. Broker suchen sich einen eigenen Port und sind gegenseitig verbunden,ergeben dadurch ein Grid. Dies zwar etwas
  27. langsamer,aber dafür ausfallsicherer. Siehe http://activemq.apache.org/networks-of-brokers.html
  28. -->
  29. <amq:broker useJmx="false" persistent="false">
  30. <!-- Wird benötigt um JMX endgültig zu deaktivieren -->
  31. <amq:managementContext>
  32. <amq:managementContext connectorHost="localhost" createConnector="false" />
  33. </amq:managementContext>
  34. <!-- Nun die normale Konfiguration für Network of Brokers -->
  35. <amq:networkConnectors>
  36. <amq:networkConnector networkTTL="1" duplex="true" dynamicOnly="true" uri="multicast://default" />
  37. </amq:networkConnectors>
  38. <amq:persistenceAdapter>
  39. <amq:memoryPersistenceAdapter />
  40. </amq:persistenceAdapter>
  41. <amq:transportConnectors>
  42. <amq:transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default" />
  43. </amq:transportConnectors>
  44. </amq:broker>
  45.  
  46. </beans>

为此,不需要为jvm指定-Dcom.sun.management.jmxremote = false.哪个也不为我工作,因为connectionfactory启动了jmx连接器.

编辑:

Tonys的回答让我重新思考了这个配置,我发现一个简化的版本.

  1. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.apache.org/schema/core"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.springframework.org/schema/beans
  4. http://www.springframework.org/schema/beans/spring-beans.xsd http://activemq.apache.org/schema/core
  5. http://activemq.apache.org/schema/core/activemq-core-5.3.2.xsd">
  6.  
  7. <!-- Caching,broker sind untereinander vernetzt. Nur wenn hier nochmals jmx
  8. deaktiviert wird,bleibt es auch deaktiviert...
  9. -->
  10. <amq:connectionFactory id="amqConnectionFactory" brokerURL="vm://default?broker.persistent=false" />
  11.  
  12. <!--
  13. Broker suchen sich einen eigenen Port und sind gegenseitig verbunden,aber dafür ausfallsicherer. Siehe http://activemq.apache.org/networks-of-brokers.html
  14. -->
  15. <amq:broker useJmx="false" persistent="false">
  16. <amq:networkConnectors>
  17. <amq:networkConnector networkTTL="1" conduitSubscriptions="true" duplex="true" dynamicOnly="true"
  18. uri="multicast://default" />
  19. </amq:networkConnectors>
  20. <amq:persistenceAdapter>
  21. <amq:memoryPersistenceAdapter />
  22. </amq:persistenceAdapter>
  23. <amq:transportConnectors>
  24. <amq:transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default" />
  25. </amq:transportConnectors>
  26. </amq:broker>

解决方法

可以将其他参数传递给代理URL,例如
  1. vm://localhost?broker.persistent=false&broker.useJmx=false

broker.useJmx = false会做伎俩.

猜你在找的Java相关文章