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

Sim*_*her 5 jboss jms java-ee message-driven-bean wildfly

我在域模式下运行JBoss Wildfly 8.1.0.Final,有两个节点("host-1"和"host-2"),需要从一个节点向集群中的所有节点发送消息才能执行对所有人采取某种行动.发送消息的客户端和消息接收者应该在同一个EAR中.

由于这个问题到目前为止还没有得到答复和解决,我将把问题分解为更简单的部分.请随时回答或评论一个子集,以便我进一步调查.

  1. 假设这是消息驱动bean的有效用例,我是否正确?如果没有,为什么?在这种情况下,问题的其余部分可能毫无意义.

  2. 我创建了一个javax.jms.Topicdomain.xmlJBoss的集群的域控制器的"主机1".原则上正确吗?

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

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

上述设置在本地工作,即消息仅由发送它的节点接收.其他节点不接收它.发送消息的客户端代码是从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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

日志输出表明useSharedSubscriptionInClusteredContainer并且connectionFactoryJndiName不受支持,但我再次将它们作为对我的失败尝试的参考:-)

发送消息的代码位于同一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);
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏.

小智 0

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