2013-01-10 63 views
4

我希望做一個限制在ActiveMQ的一些隊列的消費者,在hornetq(JBoss的,這是在MDB消費者的定義註釋做)。我無法找到的ActiveMQ文檔中的任何類似的,我找到最接近的是這ActiveMQ的節流消費者

consumer.recvDelay 0 ms Pause consumer for recvDelay milliseconds with each message (allows consumer throttling). 

http://activemq.apache.org/activemq-performance-module-users-manual.html

但我找不到我怎麼可以在java中做到這一點。

在此先感謝,

問候。

編輯:這裏是ActiveMQManager碼和消費者的代碼:

public class ActiveMQManager { 

private static ActiveMQConnectionFactory CONNECTION_FACTORY; 

public static Connection CONNECTION; 

public static Session SESSION; 

public static Destination TEST_QUEUE; 

public static void start() { 
    try { 

     CONNECTION_FACTORY = new ActiveMQConnectionFactory("vm://localhost"); 

     CONNECTION = CONNECTION_FACTORY.createConnection(); 
     CONNECTION.start(); 

     SESSION = CONNECTION.createSession(false, 
       Session.CLIENT_ACKNOWLEDGE); 

     TestClient testClient = new TestClient(); 

     TEST_QUEUE = SESSION.createQueue("TEST.QUEUE"); 

     MessageConsumer testConsumer = SESSION.createConsumer(TEST_QUEUE); 
     test.setMessageListener(testClient); 

    } catch (Exception e) { 
    } 
} 

public static void stop() { 
    try { 
     // Clean up 
     SESSION.close(); 
     CONNECTION.close(); 
    } catch (JMSException e) { 
     log.error(e); 
    } 
} 

}

消費者代碼很簡單(在這個例子中):

public class TestConsumer implements MessageListener { 

@Override 
public void onMessage(Message message) { 
    //Do something with the message 
} 

}

+0

您可以發佈消費者代碼/配置嗎? –

+0

好吧,我會將它添加到問題中。 –

回答

7

這取決於消費者的技術......但這裏有幾個選項

  • 您可以手動在消費者代碼引入一個延遲(不一個確切的科學,但這會限制吞吐量)

  • 你也可以通過設置你的JMS連接的maxConcurrentConsumers屬性來控制你的客戶使用的線程數......這就是說,th是不會油門消息吞吐量,只是限制併發水平正在使用你的消費者

  • 更好的是,你可以設置郵件的確切數目使用一個節流EIP的實施

    每個時間段消耗例如,這是微不足道的使用Camel Throttler

    from("activemq:queueA").throttle(10).to("activemq:queueB")

+0

是啊,我們正在使用睡眠在線程中做延遲,這很醜陋,因爲我明白這個問題,駱駝看起來很有趣,但我們沒有時間(現在)實施該解決方案,但將來也許我們會這樣做。 –

+0

無論如何,thx的答案,這有助於繼續搜索解決方案 –

+0

okey。 thx爲您的評論今天,無論如何,我仍然不能證明「駱駝」的解決方案,但似乎是最好的答案,恭喜,你有賞金:) –

3

使用ActiveMQ,您可以設置消費者預取限制:http://activemq.apache.org/what-is-the-prefetch-limit-for.html

要對其進行配置,可以使用連接URL或Java API(大部分配置都可以使用URL來完成)。

更有趣的參數:使用http://activemq.apache.org/connection-configuration-uri.html

+0

thx,我會研究這個選項,如果你有工作的獎金 –

+2

prefetch限制只控制消費者發送/緩衝消息的算法,而不是消費的速度... –

1

要考慮到駱駝調節器保持在內存中的交流,而他們被阻擋由Throttler。因此,如果您有100個隊列使用者,並且服務器(公開SOAP服務)速度很慢,那麼您可能會在內存中存儲多達100個交換機!

發表了此問題:Throttle consumption rate of all JMS consumers listening on an ActiveMQ queue

+1

歡迎來到SO。您的陳述:_「我想知道是否有ActiveMQ功能在ActiveMQ級別上施加節流要求。」_似乎是一個問題。如果現有答案無效,請提出新問題。或者,如果我誤解了你的答案,請考慮改寫。 –