Jms 群集WildFly 10域消息传递

Jms 群集WildFly 10域消息传递,jms,cluster-computing,wildfly,activemq-artemis,Jms,Cluster Computing,Wildfly,Activemq Artemis,我有三台机器位于不同的网络中: 作为主人 as-node-1 as-node-2 在as master中,我将WildFly作为域主机主节点,两个节点将WildFly作为域主机从节点,每个节点在完整的ha服务器组中启动一个实例。从as主web控制台中,我可以在完整的ha配置文件运行时中看到这两个节点,如果我部署WAR,它将在两个节点上正确启动 现在,我试图实现的是WAR的两个实例之间的消息传递,即从as-node-1中的生产者实例发送消息,所有节点中的消费者都应该接收消息 这就是我尝试的:向

我有三台机器位于不同的网络中:

  • 作为主人
  • as-node-1
  • as-node-2
在as master中,我将WildFly作为域主机主节点,两个节点将WildFly作为域主机从节点,每个节点在完整的ha服务器组中启动一个实例。从as主web控制台中,我可以在完整的ha配置文件运行时中看到这两个节点,如果我部署WAR,它将在两个节点上正确启动

现在,我试图实现的是WAR的两个实例之间的消息传递,即从as-node-1中的生产者实例发送消息,所有节点中的消费者都应该接收消息

这就是我尝试的:向WildFly
domain.xml添加了一个主题:

<jms-topic name="MyTopic" entries="java:/jms/my-topic"/>
创建一个MDB,收听以下主题:

@Path("jms")
@RequestScoped
public class MessageEndpoint {

    @Inject
    JMSContext context;

    @Resource(mappedName = "java:/jms/my-topic")
    Topic myTopic;

    @GET
    public void sendMessage() {
         this.context.createProducer().send(this.myTopic, "Hello!");
    }

}
@MessageDriven(activationConfig = {
    @ActivationConfigProperty(
        propertyName = "destination",
        propertyValue = "java:/jms/my-topic"
    ),
    @ActivationConfigProperty(
        propertyName = "destinationType",
        propertyValue = "javax.jms.Topic")
    )
)
public class MyMessageListener implements MessageListener {

    private final static Logger LOGGER = /* ... */

    public void onMessage(Message message) {
        try {
            String body = message.getBody(String.class)
            LOGGER.info("Received message: " + body);
        } catch (JMSException e) {
            throw new RuntimeException(e);
        }
    }

}
但是当我
curlas-node-1/jms
时,我只在as-node-1中看到日志,当我
curlas-node-2/jms
时,我只在as-node-2中看到日志


消息不应该在部署战争的所有节点上传递吗?我遗漏了什么?

因为我提出了一个完全相同的问题——把答案放在这里

是的,如果目的地是主题,则应将消息传递到所有节点

在默认配置下,ActiveMQ Artemis使用广播发现并连接到其他节点(在同一发现组中)上的其他ActiveMQ实例:


仍然需要确保jms主题的JNDI名称以“jms”开头,以匹配上一行中的
address=“jms”
(在您的情况下可以:“
java:/jms/my-topic
”)

在您的示例中,要让它在所有节点上运行,唯一遗漏的是:


(确保
activemqUser
user必须提前添加,例如使用addUser.sh脚本)

这使ActiveMQ实例能够相互通信。所谓的核心网桥连接是在节点之间创建的。如下列文件所述:

…这是在幕后透明完成的-你不必 为每个节点声明一个显式网桥

如果一切正常,则可以在server.log:
AMQ221027:bridge中找到网桥ClusterConnectionBridge@63549ead[name=sf.my-cluster…]已连接。

顺便说一句,如果目标是队列,那么ActiveMQ将不会向其他节点发送消息,除非消息未在本地使用

注意:这是指将事件分发到集群中所有节点的经典方法

<discovery-group name="dg-group1" jgroups-channel="activemq-cluster"/>
<cluster-connection name="my-cluster" discovery-group="dg-group1" connector-name="http-connector" address="jms"/>