2013-02-28 106 views
2

我正在嘗試學習activemq +駱駝以便將其應用於真實世界。我需要消費一個隊列,處理消息並將其移動到另一個隊列。JMS隊列輪詢示例

我關心的表現。我需要每天處理至少100.000條消息。現在我不想處理垂直或水平縮放(我們不能花更多的錢,直到人們確信技術是好的)。

所以,我想到了開始幾個線程,它將輪詢隊列,消耗,處理和移動消息到其他隊列。線程的數量取決於硬件如何響應負載的增加。

我的第一個問題是:這是一個很好的方法(啓動paralel線程消耗隊列)?

我的第二個問題是:我從閱讀Camel In Action開始學習。我不知道我是否錯過了一些東西,但是我對如何建立消費者有點困惑。通過修改FtpToJMSExample書籍示例,我提出了代碼如下。在現實世界中,我不會爲每個線程創建連接。我將使用應用程序服務器(glassfish)提供的連接池。

public class JMSToJMSExample { 
    public static void main(String args[]) throws Exception { 
     CamelContext context = new DefaultCamelContext(); 
     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost"); 
     context.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory)); 
     context.addRoutes(new RouteBuilder() { 
      public void configure() { 
       from("jms:in") 
        .process(new CustomProcessor()) 
        .to("jms:out"); 
} }); 
     context.start(); 
     Thread.sleep(10000); 
     context.stop(); 
    } 
} 

它工作正常。但是,這本書稱之爲「投票」解決方案。我期待的是類似於while循環的東西,所以當隊列中有消息時,它會持續消耗。好的,這個例子是輪詢一個隊列,但我的觀點與上面的例子是,如果我減少睡眠時間,它會退出,而不處理它可能的所有消息。

但無論如何,我認爲最好是建立一個長時間運行的線程,而不是每次線程喚醒時都要求連接池給我一個連接。

請問,既然我在學習,你可以舉一些如何創建一個線程輪詢jms隊列直到它變空,而不是按時間/週期輪詢的例子嗎?

TIA,

鮑勃

回答

0

一對夫婦的東西.. ..

  • 你的問題,「這是一個好方法(開始平行線程消耗隊列)?」 絕對,這是一個非常常見的設計模式
  • 的路線將繼續只要你CamelContext運行(你不需要一個循環或定時器)消耗,看到http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html
  • 路線看起來應該這樣,注意maxConcurrentConsumers屬性指示多個消費者線程從IN隊列,過程拉他們的消息,並將其推到出隊列的慾望,

    from("jms:in?maxConcurrentConsumers=10") 
    .process(new CustomProcessor()) 
    .to("jms:out); 
    

看到http://camel.apache.org/activemq.html更多細節