【问题标题】:Is it possible to create an empty queue with Camel Seda?是否可以使用 Camel Seda 创建一个空队列?
【发布时间】:2013-01-26 18:29:45
【问题描述】:

最近我遇到了一个问题。如何使 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 作为队列。

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

非常感谢任何帮助!

【问题讨论】:

  • 尝试格式化您的问题:)
  • 我改了标题。是你的意思吗? :)

标签: java apache-camel


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多