2012-01-02 52 views
4

我有一個將消息推送到主題的發佈者。我有多個訂戶,每個訂戶在消費主題消息後都會執行不同的任務。 現在我希望我的系統能夠擴展到在不同主機/同一主機上運行的同一進程的多個實例。例如我想在不同的主機上運行應用程序A的多個副本,以便如果A的一個實例很慢,那麼其他實例可以引入後續消息並推進進度。 我發現這可以使用虛擬目標。我遵循這裏的步驟 - http://activemq.apache.org/virtual-destinations.html如何使用虛擬目標創建多個activemq主題訂戶實例?

但是,我如何設置我的多個訂戶到相同的主題與相同的客戶端ID?當我試圖做到這一點,我得到的錯誤。當我嘗試其他方式時,它不起作用。有人可以幫忙嗎?

通常情況下,我做了下面的步驟啓動用戶 -

 ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL;); 
     activeMQConnection = connectionFactory.createConnection(); 

     activeMQConnection.setClientID("subscriber1"); 
     activeMQConnection.setExceptionListener(exceptionListener); 
     activeMQSession = activeMQConnection.createSession(false, Session.CLIENT_ACKNOWLEDGE); 
     activeMQTopic = activeMQSession.createTopic("myTopic");    
     activeConsumer = activeMQSession.createDurableSubscriber(activeMQTopic, "myTopic");    
     activeConsumer.setMessageListener(messageListener); 
     activeMQConnection.start(); 

當我嘗試創建一個第二用戶,並通過主題名稱爲「VirtualTopic.myTopic」,沒有任何反應。一旦你瞭解它

感謝

+0

@vinod你提到這些[鏈接](http://activemq.apache.org/virtual-destinations.html)。我看到XML代碼在link.Where會發現那個xml文件。 – Hanumath 2013-09-05 06:08:53

回答

5

虛擬主題的功能非常簡單,功能相當強大。

  1. 使用虛擬主題時 - 不需要耐用消費者。這是因爲對於每個客戶端,您將獲得創建的常規隊列實例。如果您有5個客戶端(應用程序A,B,C,D,E),每次將消息發送到虛擬主題時,您將創建5個隊列並填充消息副本。

  2. 實際上,它是耐用消費者的限制 - 每個clientId只允許一個連接。作爲一個普通的隊列,你可以創建儘可能多的消費者,隊列將保證1個消息只能被1個消費者接收。因此,如果您的應用程序A需要1分鐘來處理消息,則可以創建5個實例來監聽同一隊列。當您在1秒內發佈5條消息時,您的每個應用程序都將收到自己的消息進行處理。

  3. 有沒有很好的文件記錄的要求是不直觀的。爲了使虛擬專題的工作,你需要

    • 使用VirtualTopic.在您的主題名稱,例如VirtualTopic.Orders(這個前綴可配置)
    • 使用Consumer.在隊列中,你的名字。 Like Consumer.ApplicationA.VirtualTopic.Orders其中應用程序A實際上是您的客戶端ID
    • 對上面的隊列使用常規訂閱者而不是持久訂閱者。

示例:每當自動消費者的第一個實例所訂閱創建它

string activeMqConsumerTopic = "Consumer.AmqTestConsumer.VirtualTopic.Orders"; 

IQueue queue = SessionUtil.GetQueue(session, activeMqConsumerTopic); 

IMessageConsumer consumer = session.CreateConsumer(queue); 

隊列。從那一刻起,所有發送到主題的消息都被複制/複製到所有關聯的隊列中。

希望這會有所幫助。

+0

非常感謝,你的回答非常清楚 – deFreitas 2017-05-12 05:15:18

1

虛擬主題是你的答案。但是,您必須爲所有虛擬主題隊列定義一個命名標準。下面是這個答案:

虛擬主題使用以下前瞻性幫助:消息 1.負載平衡 2.用戶的快速故障切換。 3.重新使用不同生產者和消費者相同的連接工廠。 (耐用用戶需要唯一的JMS客戶端ID,並且不能重複用於任何其他生產者或消費者)

這裏是做到這一點的方法,下面的示例創建前綴VTCON。*。因此,每個包含此前綴和主題名稱的隊列都將消費該消息。

<virtualDestinations> <virtualTopic name="TEST.TP01" prefix="VTCON.*." selectorAware="false"/> </virtualDestinations>

http://workingwithqueues.blogspot.com/2012/05/activemq-virtual-topics-or-virtual.html

相關問題