消费者/生产者AWS SQS akka scala与同步消费者

时间:2016-06-17 13:06:32

标签: scala akka amazon-sqs producer-consumer akka-camel

我的应用程序有生产者和消费者。我的制作人不定期地制作消息。有时我的队列将是空的,有时我会有一些消息。 我想让我的消费者收听队列,当消息在其中时,接受并处理此消息。这个过程可能需要几个小时,如果他还没有完成处理当前消息,我也不希望我的消费者收到队列中的另一条消息。

我认为AKKA和AWS SQS可以满足我的需求。通过阅读文档和示例,似乎akka-camel可以简化我的工作。

我在github上找到了这个example

我对使用者的配置更感兴趣(Thread.sleep只是为了模拟我的处理):

class MySqsConsumer extends Consumer {

  //The SQS URI is an in-only message exchange (autoAck=true)
  override def endpointUri = "aws-sqs://sqs-akka-camel?  amazonSQSClient=#client"

  override def receive = {
    case msg: CamelMessage => {
      println("Start received %s" format msg.bodyAs[String])
      Thread.sleep(4000)
      println("Stop received %s" format msg.bodyAs[String])

    }

  }
 }

StackTrace:

...
14:38:53.335 [Camel (sqs-akka-camel) thread #0 - aws-sqs://sqs-akka-camel] DEBUG o.a.camel.processor.SendProcessor - >>>> Endpoint[akka://sqs-akka-camel/user/consumer?autoAck=true&replyTimeout=60000+milliseconds] Exchange[Message: Hello World1!]
14:38:54.051 [Camel (sqs-akka-camel) thread #0 - aws-sqs://sqs-akka-camel] DEBUG o.a.camel.processor.SendProcessor - >>>> Endpoint[akka://sqs-akka-camel/user/consumer?autoAck=true&replyTimeout=60000+milliseconds] Exchange[Message: Hello World2!]
14:38:54.753 [Camel (sqs-akka-camel) thread #0 - aws-sqs://sqs-akka-camel] DEBUG o.a.camel.processor.SendProcessor - >>>> Endpoint[akka://sqs-akka-camel/user/consumer?autoAck=true&replyTimeout=60000+milliseconds] Exchange[Message: Hello World3!]
Start received Hello World1!
Stop received Hello World1!
Start received Hello World2!
Stop received Hello World2!
Start received Hello World3!
...

我的问题是akka-camel在接收方法完成之前从队列中读取消息。

在接收新消息之前,如何让我的消费者等待流程结束?如果我使用错误的工具/库,您能指导我使用新工具吗?

2 个答案:

答案 0 :(得分:1)

不确定您是否使用了akka流,但如果您使用的话,请将您的来源发送到Sink.queue

val graph=yourSource.to(Sink.queue)

当具体化(graph.run)时,它将返回一个SinkQueue,您可以从中手动拉取项目。它将使用背压机制,因此您不必担心如果您不拉物品会发生什么。

注意:我故意忽略了泛型!但不要忘记他们。

答案 1 :(得分:0)

据我所知,你不能这样做。 Camel一直消耗队列中的消息。

您可以设置override def autoAck = false - 在您确认当前消息之前,它不会向receive()发送另一条消息。但是"隐藏"骆驼演员仍然会消耗。

也许您可以提供自定义amazonSQSClient并以某种方式控制它。