2013-08-28 24 views
0

關於Camel中的SEDA組件,任何人都知道路由器在路由它時是否將Exchange對象從隊列中刪除?我的路由器工作正常,但恐怕它保持在隊列中的交換對象,所以我的隊列將不斷增長......在Camel中讀取和刪除SEDA隊列中的Exchange

這是我的路由器:

public class MyRouter extends RouteBuilder { 

     @Override 
     public void configure() { 
     from("seda:input") 
      .choice() 
      .when(someValue) 
      .to("bean:someBean?method=whatever") 
      .when(anotherValue) 
      .to("bean:anotherBean?method=whatever"); 
     } 
} 

如果沒有,任何人都知道如何從隊列中刪除Exchange對象,一旦它被路由或處理(我將消息路由到我的應用程序中的某些bean,並且它們工作正常,唯一的問題是在隊列中)。

另一個問題是,如果我的輸入Exchange不符合任何選擇條件會發生什麼?它也保持在隊列中嗎?

非常感謝。

編輯:在閱讀克勞斯的答案後,我已經添加了end()方法到路由器。但是我的問題依然存在,至少在一起測試賽達和路由器的時候。我在隊列中放置了一些消息,嘲笑端點(它正在接收消息),但是每次執行測試時隊列都會變滿。也許我錯過了一些東西。這是我的測試:

@Test 
    public void test() throws Exception { 
    setAdviceConditions(); //This method sets the advices for mocking the endpoints 

    Message message = createMessage("text", "text", "text"); //Body for the Exchange 
    for (int i = 0; i < 10; i++) { 
     template.sendBody("seda:aaa?size=10", message); 
    } 

    template.sendBody("seda:aaa?size=10", message); //java.lang.IllegalStateException: Queue full 
    } 

謝謝!!

再次編輯:檢查我的路由器之後,我意識到了這個問題,我在寫一個不同的端點不是一個路由器從(捂臉)

謝謝聖誕老人的回答閱讀。

回答

1

1)

是的,當Exchange從SEDA隊列路由它立即刪除。該代碼使用poll()輪詢並從SEDA隊列中獲取頂部消息。

SEDA是基於內存的,因此交換存儲在SEDA隊列內存中。您可以配置隊列大小,以便隊列只能容納X個消息。請參閱SEDA文檔:http://camel.apache.org/seda

還有一些您可以從管理控制檯清除隊列(例如清空隊列)的JMX操作。

2)

當選擇有沒有謂詞匹配,則什麼也不會發生。如果需要,您可以在其他情況下執行一些邏輯。

而且記住,您可以繼續選擇後的路線,如

@Override 
    public void configure() { 
    from("seda:input") 
     .choice() 
     .when(someValue) 
      .to("bean:someBean?method=whatever") 
     .when(anotherValue) 
      .to("bean:anotherBean?method=whatever") 
     .end() 
     .to("bean:allGoesHere"); 
    } 

例如,在上面的例子中,我們已經結束()來表示,其中選擇結束。所以之後,所有的消息去那裏(也是那些不符合任何謂詞)