是否可以使用Camel Seda创建一个空队列?

时间:2013-01-25 19:26:19

标签: java apache-camel

最近我提出了一个问题。如何使Camel应用程序限制同时提供的连接。首先我想到了Throttler EIP,但在阅读之后不再使用它,并且总结它不符合我的需要。 Throttler每秒最多配置10条消息,只允许通过我的消息系统,即使10个请求在几毫秒的时间内完成。我需要提供10个并发连接,这意味着我每秒可以拥有数百条消息的吞吐量 - 但10个连接限制永远不能超出。如果它被超过,我必须向调用者返回一个例外,告诉他不允许一次使用超过10个连接。我无法以任何方式排列他的请求,请求必须在他们到达(或被拒绝)后立即提供。

然后我发现SEDA组件可以满足我的需要。使用10个并发消费者,队列大小为0(零),我将同时提供10个连接的限制,并且每个新连接都将被拒绝。问题是SEDA的表现如何,在Camel 2.10.3中。当我配置“size = 0”时,它会自动使用Integer.MAX_VALUE(在jConsole中看到)。当我将队列设置为“1”时,它按预期工作,但我根本没有任何队列。

搜索Camel SEDA的源代码,我看到它使用LinkedBlockingQueue作为SEDA队列,它的容量不能为0.因此使用默认构造函数,实际上使用Integer.MAX_VALUE作为队列。 / p>

我错过了什么吗?还有其他方法可以解决我的问题吗?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您还可以使用线程使用线程池并发执行消息,您可以在其中指定最小/最大线程。

from(somewhere)
   .threads(10)
   .to(a)
   .to(b)

本页底部的一些详细信息:http://camel.apache.org/async.html

答案 1 :(得分:0)

连接可能意味着许多事情,但我认为您希望限制路线中的航班交换次数。有一些组件确实具有内置的内容,例如jetty组件(假设你不做异步的东西)。在通用情况下,您可以使用路由策略。你可能需要写一个你自己的,但它应该相当简单。我想提供的ThrottlingInFlightRoutePolicy对你的情况来说太粗糙了。