2017-08-10 109 views
1

我有三台机器位于不同的网络:群集WildFly 10域消息

  • 作为主
  • 作为节点-1
  • 作为节点-2

在如-master我将WildFly作为域主机主机,两个节点将WildFly作为域主机 - 从机,每个都在全功能服务器组中启动一个实例。在as-master Web控制台中,我可以看到full-ha配置文件运行时中的两个节点,如果我部署WAR,它将在两个节点上正确启动。

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

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

<jms-topic name="MyTopic" entries="java:/jms/my-topic"/> 

创建JAX-RS端点触发绑定到该话题生产者:

@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!"); 
    } 

} 

创建一个MDB监听到主题:

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

} 

但是当我curl as-node-1/jms我看到日志o只有as-node-1,而当我curl as-node-2/jms我只看到as-node-2的日志。

不应该在部署WAR的所有节点上传递消息吗?我错过了什么?

回答

2

因为我提出了完全相同的问题 - 在这里提出答案。

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

在默认配置下的ActiveMQ阿蒂米斯使用广播查找并连接到其他节点上的其他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"/> 

仍需要确保为JMS JNDI名称与“JMS” -topic开始在上面的线匹配address="jms"(什么是你的情况确定:“java:/jms/my-topic”)

在你的榜样错过的唯一的事情得到它的所有节点上的工作是:
<cluster password="yourPassword" user="activemqUser"/>
(肯定activemqUser用户必须先加入,例如,与addUser.sh脚本)。

这让ActiveMQ实例相互通信。所谓的核心桥接器在节点之间创建连接。如ActiveMQ manual中所述:

..这个用户是透明的幕后 - 你不必 宣布一个明确的桥梁,为每个节点

如果一切正常,则可以大桥在server.log中找到:AMQ221027: Bridge [email protected] [name=sf.my-cluster ...] is connected.

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

P.s.如回答here,这指的是将事件分发到群集中的所有节点的经典方法。