在Camel中从SEDA队列中读取和删除Exchange

时间:2013-08-28 18:44:40

标签: spring queue apache-camel

关于Camel中的SEDA组件,任何人都知道路由器在路由时是否从队列中删除了Exchange对象?我的路由器工作正常,但我担心它会将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()方法添加到路由器中。但是我的问题仍然存在,至少在测试seda和路由器的时候。我在队列中放入一些消息,模拟端点(正在接收消息),但每次执行测试时队列都会变满。也许我错过了什么。这是我的考验:

@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 个答案:

答案 0 :(得分:1)

1)

是的,当Exchange从SEDA队列路由时,会立即将其删除。该代码使用poll()来轮询并从SEDA队列中获取最顶层的消息。

SEDA是基于内存的,所以是的,Exchange存储在内存中的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");
  }

例如在上面的例子中,我们有end()来指示选择结束的位置。所以在那之后所有的消息都去了那里(也就是没有匹配任何谓词的那些消息)