Akka,Camel和ActiveMQ:限制消费者

时间:2014-05-14 16:29:24

标签: scala apache-camel activemq akka

我有一个非常基本的框架Scala应用程序(使用Akka,Camel和ActiveMQ),我希望尽快将其发布到ActiveMQ队列,但之后只能以特定速率从该队列中消耗(例如1)每秒)。

以下是一些代码来说明:

MyProducer.scala

class Producer extends Actor with Producer with Oneway {
  def endpointUri = "activemq:myqueue"
}

MyConsumer.scala

class MyConsumer extends Actor with Consumer {

  def endpointUri = "activemq:myqueue"

  def receive = {
    case msg: CamelMessage => println("Ping!")
  }
}

在我的主要方法中,然后我将所有样板设置为Camel并让它与ActiveMQ对话,然后我有:

// Start the consumer
val consumer = system.actorOf(Props[MyConsumer])
val producer = system.actorOf(Props[MyProducer])

// Imagine I call this line 100+ times
producer ! "message"

我如何才能使MyProducer尽可能快地向ActiveMQ发送内容(即没有限制),同时确保MyConsumer只读取每个 x 秒?我希望每条消息都保留在ActiveMQ队列中,直到最后一刻(即MyConsumer读取它)。

到目前为止,我已设法使用TimerBasedThrottler以一定的费率消费,但这仍然消耗了所有消息。

道歉,如果我一路上遗漏了一些东西,我对Akka / Camel来说相对较新。

1 个答案:

答案 0 :(得分:0)

有多少消费者包含" MyConsumer"?

a)如果它只是一个,那么不清楚为什么阅读/消费消息之间的简单睡眠不起作用。

如果有多个消费者,您需要哪种行为:

  • 每个消费者被限制到指定的消费率。在这种情况下,每个Consumer线程的行为仍然如a)
  • 中所述
  • 整体消费者群体受到消费率的限制。在这种情况下,中央Throttler需要保留消息间延迟并阻止每个消费者,直到满足所需的延迟。当存在积压时,管理的复杂性将会增加 - 允许"追赶"。你可能会在这里漂流。

在这个问题中,您可能正在寻找其他/更具体的内容。如果是,请详细说明。