【问题标题】:Send message to all nodes in JBoss cluster domain向 JBoss 集群域中的所有节点发送消息
【发布时间】:2014-11-20 01:41:52
【问题描述】:

我在域模式下运行 JBoss Wildfly 8.1.0.Final,有两个节点(“host-1”和“host-2”),需要从一个节点向集群中的所有节点发送消息为了对所有这些执行特定的操作。发送消息的客户端和消息接收者应该在同一个 EAR 中。

由于到目前为止该问题尚未得到解答和评论,因此我将把问题分解为更简单的部分。请随意回答或评论仅一个子集,以便我进一步调查。

  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 不受支持,但我再次将它们作为我的失败尝试的参考:-)

发送消息的代码在同一个 EAR 的 WAR 中:

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);

非常感谢任何帮助。

【问题讨论】:

  • 我也有兴趣以任何方式使这个问题更清楚或更容易回答,因为它尚未受到任何关注。

标签: jakarta-ee jboss jms wildfly message-driven-bean


【解决方案1】:

第一个在 jboss 中没有 master 或 slave 你应该在配置文件级别定义所有内容并将服务器组关联到该配置文件,最后在集群中部署应用程序 2您使用的是哪个配置文件?是全哈吗?否则队列将不会被聚集

【讨论】:

  • "master" 和 "slave" 只是其他人分配的名称 - 抱歉,它们对问题没有意义,将删除。您能否详细说明 full-ha 配置文件中究竟是什么使队列聚集在一起?大概就是这个原因吧。
  • 部分你应该看到 ${jboss.messaging.cluster.password:CHANGE ME!!} 你应该更改密码跨度>
  • 需要hornetq部分的其他部分来获取集群中的JMS但通常最好使用full-ha配置文件来拥有它
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 2015-07-30
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 2010-12-24
  • 2021-10-23
  • 1970-01-01
相关资源
最近更新 更多