1

最近我想出了一个问题。如何使 Camel 应用程序限制同时服务的连接。首先,我想到了 Throttler EIP,但在阅读了它之后没有考虑使用它,并得出结论认为它不适合我的需要。配置为每秒最多 10 条消息的 Throttler 将只允许这么多消息通过我的消息系统,即使这 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 作为队列。

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

任何帮助是极大的赞赏!

4

2 回答 2

1

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

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

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

于 2013-01-26T10:29:45.347 回答
0

连接可能意味着很多事情,但我假设您想限制路线中飞行中的交换数量。有些组件确实内置了类似的东西,例如码头组件(假设你不做异步的东西)。在一般情况下,您可以使用路由策略。您可能需要自己编写一个,但它应该相当简单。我猜提供的 ThrottlingInFlightRoutePolicy 对于您的情况来说过于粗糙。

于 2013-01-26T07:21:09.517 回答