2011-03-16 57 views
0

我用下面的URL創建ActiveMQConnactionFactory:如何強制ActiveMQ連接隨機選擇新消費者的代理?

failover:(tcp://server1:port,tcp://server2:port,tcp://server2:port) 

我想要做的就是從這個網絡經紀人創建多個消息的消費者。 下面是不是一個真正的代碼,但它有助於我已瞭解如何做到這一點:

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("BROKER_URL"); 
connection = connectionFactory.createConnection(); 
connection.start(); 

for (int i=0; i<10; i++) { 
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); 
Destination queue = consumerSession.createQueue("QUEUE_NAME"); 
consumer = consumerSession.createConsumer(queue); 
consumer.setMessageListener(new MessageListener()); 
} 

的問題是,所有的消費者都可以連接到一個隨機choosen經紀人。 但我希望他們在經紀人網絡上保持平衡。

我相信有可能通過與工廠建立多個連接來實現這一點。

但是,最佳做法是什麼? 這是我想要的好東西嗎? :)

+0

您的編輯更改了很多問題,並且經常回答如下: 它取決於。 您是否有生產者在這些經紀商中生產?這是一個經紀人網絡嗎? 。您應該提供有關您的情況和您想要達到的額外信息。除此之外,這個「編輯」將問題從「我該如何編碼這個問題」轉變爲「我該如何設計這個問題」這個問題。也許考慮一個新的問題,需要額外的信息才能給出正確的答案。 – Noctris

+0

其實,我只改變了問題標題:)是的,我有一個由多個生產者組成的經紀人網絡,我想從整個網絡中同時使用消息。 – Pavel

回答

0

其實,消費者不會連接到隨機選擇的經紀人。

連接是連接到代理的部分。使用您提供的連接字符串,您將有一個連接映射到一個隨機選擇的代理。所有消費者都有自己的會話,但這些會使用與該經紀人相同的ONE連接。

我知道的唯一設置是,您可以通過在連接字符串上設置?randomize=false來禁用故障轉移協議的隨機行爲。這將意味着您的連接將首先嚐試第一個,然後第二個,然後第三個等。

但要達到您的要求。我會讓每個消費者擁有自己的連接。這與故障轉移協議中的隨機功能一起會對消費者進行負載平衡;但並不是真的,那裏沒有任何情報,只是「隨機化」了它所連接的經紀商。

這意味着,我會做以下(從您的代碼)

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("BROKER_URL"); 

for (int i=0; i<10; i++) { 

connection = connectionFactory.createConnection(); 
connection.start(); 
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); 
Destination queue = consumerSession.createQueue("QUEUE_NAME"); 
consumer = consumerSession.createConsumer(queue); 
consumer.setMessageListener(new MessageListener()); 

} 

這樣一來,每個消費者都會有它自己的連接到「一」的券商你的故障轉移連接字符串

問題變更後更新:

如果你想讓ActiveMQ爲每個消費者隨機選擇一個經紀人,上述解決方案就是要走的路。

最好的做法是讓您的消費者和生產者儘可能地接近。爲此,我建議降低網絡消費者的優先級,因此當地消費者和生產者將具有最高優先級。只有當本地消費者閒置時,它纔會通過網絡進一步分配給其他消費者。

除此之外,如果消費者端的操作長時間運行以設置較低的預取值,這樣消息在代理網絡周圍獲得負載均衡,而不是一個消費者搶佔1,000條消息,而其他消費者閒置。