【发布时间】:2014-11-20 01:41:52
【问题描述】:
我在域模式下运行 JBoss Wildfly 8.1.0.Final,有两个节点(“host-1”和“host-2”),需要从一个节点向集群中的所有节点发送消息为了对所有这些执行特定的操作。发送消息的客户端和消息接收者应该在同一个 EAR 中。
由于到目前为止该问题尚未得到解答和评论,因此我将把问题分解为更简单的部分。请随意回答或评论仅一个子集,以便我进一步调查。
假设这是消息驱动 bean 的有效用例,我是否正确?如果不是,为什么?在这种情况下,剩下的问题可能毫无意义。
我在 JBoss 集群的域控制器“host-1”的
domain.xml中创建了一个javax.jms.Topic。原则上正确吗?打算发送消息的客户端通过 JNDI 查找
Topic和ConnectionFactory(而不是注入它)。这是正确的方法吗?将接收消息的 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
日志输出表明 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);
非常感谢任何帮助。
【问题讨论】:
-
我也有兴趣以任何方式使这个问题更清楚或更容易回答,因为它尚未受到任何关注。
标签: jakarta-ee jboss jms wildfly message-driven-bean