2013-08-28 2 views
0

О компоненте SEDA в Camel, кто-нибудь знает, удаляет ли объект Exchange из очереди при его маршрутизации? Мой маршрутизатор работает нормально, но я боюсь, что он держит объекты Exchange, в очереди, так что моя очередь будет непрерывно расти ...Чтение и удаление Exchange из очереди SEDA в Camel

Это мой маршрутизатор:

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 из очереди после его маршрутизации или обработки (я направляю сообщения некоторым компонентам в моем приложении, и они работают правильно, единственная проблема в очереди).

Другой вопрос: что произойдет, если мой ввод 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 
    } 

Спасибо!

Отредактировано снова: после проверки моего маршрутизатора, я понял, проблемы, я писал в другую конечную точку, чем один маршрутизатор читал из (Facepalm)

Спасибо вам Клауса за ваш ответ.

ответ

1

1)

Да, когда Обмен направляется из 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"); 
    } 

, например, в приведенном выше примере, мы имеем конец(), чтобы указать, где выбор заканчивается. Поэтому после этого все сообщения идут туда (также те, которые не соответствуют предикатам)

Смежные вопросы