发送消息到JBoss集群域中的所有节点

问题描述:

我在两个节点(“主机-1”和“主机-2”)的域模式下运行JBoss Wildfly 8.1.0.Final并需要发送消息一个节点到集群中的所有节点,以便对它们执行特定的操作。发送消息的客户端和消息接收者应位于相同的EAR中。发送消息到JBoss集群域中的所有节点

由于到目前为止问题尚未得到答复和未注释,我将把问题分解成更简单的部分。请随时回答或评论一个子集,以便我可以进一步调查。

  1. 我正确地认为这是一个消息驱动bean的有效用例吗?如果不是,为什么?在这种情况下,问题的其余部分可能毫无意义。

  2. 我在JBoss集群的域控制器“host-1”的domain.xml中创建了javax.jms.Topic。原则上正确吗?

  3. 打算发送消息的客户端通过JNDI查找TopicConnectionFactory(而不是例如注入它)。这是正确的方法吗?

  4. 要接收消息的MDB配置为通过@ActivationConfigProperty来收听Topic。正确?

上述设置在本地工作,即消息仅由发送它的节点接收。它不被其他节点接收。发送消息的客户端代码是由WAR触发的,并且该消息由同一EAR中的EJB模块中的MDB接收。

我不确定我们是否需要RemoteConnectionFactory或者我们是否需要使用不同的方法来查找主题(目前注入MDB并由客户端查找为java:/jms/rmcTopic),因为它实际上是在远程主机上定义的。

这是我在domain.xml中的主题。我知道<clustered>标记已被弃用,但我无法找到有关Wildfly 8.1如何完成的最新文档。

<subsystem xmlns="urn:jboss:domain:messaging:2.0"> 
    <hornetq-server> 
     <clustered>true</clustered> 
     <cluster-user>hornetqcluster</cluster-user> 
     <cluster-password>hornetqcluster</cluster-password> 
     <!-- ... --> 
     <jms-connection-factories> 
      <!-- ... --> 
      <connection-factory name="RemoteConnectionFactory"> 
        <connectors> 
         <connector-ref connector-name="http-connector"/> 
        </connectors> 
        <entries> 
         <entry name="java:jboss/exported/jms/RemoteConnectionFactory"/> 
        </entries> 
      </connection-factory> 
     </jms-connection-factories> 
     <!-- ... --> 
     <jms-destinations> 
      <!-- ... --> 
      <jms-topic name="rmcTopic"> 
       <entry name="java:/jms/rmcTopic"/> 
      </jms-topic> 
     </jms-destinations> 
    </hornetq-server> 
</subsystem> 

的MDB被打包为一个EAR EJB模块,以及MDB注解是:

@MessageDriven(name = "ConfigurationMDB", activationConfig = { 
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), 
@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/rmcTopic"), 
@ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "RemoteConnectionFactory"), 
@ActivationConfigProperty(propertyName = "addressList", propertyValue = "host-1"), 
@ActivationConfigProperty(propertyName = "useSharedSubscriptionInClusteredContainer", propertyValue = "false") }) 
public class ConfigurationMDB implements MessageListener 

日志输出表明useSharedSubscriptionInClusteredContainerconnectionFactoryJndiName不支持,但同样我让他们作为参考,我的失败尝试:-)

发送所述消息是WAR中在相同的EAR的代码:

Context ic = new InitialContext(); 
ConnectionFactory cf = (ConnectionFactory) ic.lookup("java:jboss/exported/jms/RemoteConnectionFactory"); 
Topic topic = (Topic) ic.lookup("java:/jms/rmcTopic"); 
Connection connection = cf.createConnection("hornetqcluster", "hornetqcluster"); 
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
MessageProducer publisher = session.createProducer(topic); 
connection.start(); 
TextMessage message = session.createTextMessage("Test"); 
publisher.send(message); 

任何帮助,非常感谢。

+0

我也会有兴趣的任何方式使这个问题更清晰或更容易回答,因为它还没有得到任何关注。 – 2014-09-29 15:54:40

1st在jboss中没有主或从设备,您应该在配置文件级别定义所有内容并将服务器组关联到该配置文件,并最终在集群内部署该应用程序 第二步您正在使用哪个配置文件?它是全哈?否则队列将不聚集

+0

“主人”和“奴隶”只是别人分配的名字 - 对不起,他们对这个问题毫无意义,将会被删除。你能否详细说明完整公差配置文件中的队列是如何聚集的?可能是这个原因。 – 2015-06-19 11:56:37

+0

部分您应该看到 $ {jboss.messaging.cluster.password:CHANGE ME !!} cluster-password> 您应该更改密码 – marcobazzani 2015-06-19 13:28:59

+0

hornetq的其他部分部分是需要在群集 中获得JMS的。但通常最好使用full-ha配置文件来拥有它 – marcobazzani 2015-06-19 13:37:09