2017-08-10 108 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,這指的是將事件分發到羣集中的所有節點的經典方法。