0

关于 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)

谢谢克劳斯的回答。

4

1 回答 1

1

1)

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

SEDA 是基于内存的,因此交换存储在内存中的 SEDA 队列中。您可以配置队列大小,以便队列只能容纳 X 条消息。参见 SEDA 文档:http ://camel.apache.org/seda

还有 JMX 操作,您可以在其中清除队列(例如清空队列),您可以从管理控制台使用这些操作。

2)

When the choice has no predicates that matches, then nothing happens. 如果你愿意,你可以在这些情况下做一些逻辑。

另请注意,您可以在选择后继续路线,例如

@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() 来指示选择的结束位置。所以在那之后所有的消息都会去那里(还有那些不匹配任何谓词的消息)

于 2013-08-29T07:34:53.737 回答