关于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)
感谢克劳斯的回答。
答案 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()来指示选择结束的位置。所以在那之后所有的消息都去了那里(也就是没有匹配任何谓词的那些消息)