在喷雾路线中链接Akka演员

时间:2015-05-14 15:10:09

标签: scala akka actor spray

我有一个RESTful API,它接收一系列JSON消息,这些消息将转换为单独的Avro消息,然后发送给Kafka。在路由中,我调用了3个不同的actor:1)一个actor离开并从磁盘2中检索Avro架构然后循环遍历JSON消息数组并将其与第二个actor中的Avro架构进行比较。如果任何消息未验证,则我需要将响应返回给API的调用者并停止处理。 3)循环遍历数组并传递给第三个获取JSON对象的actor,将其转换为Avro消息并发送到Kafka主题。

我遇到问题的方法是如果在其中一个演员中出现故障,如何在路线中停止处理。我将请求上下文传递给每个actor并调用它的完整方法,但它似乎没有立即停止,下一个actor仍然处理,即使它不应该。这是我在路线中所做的事情的代码片段:

post {
entity(as[JsObject]) { membersObj =>
      requestContext =>
        val membersJson = membersObj.fields("messages").convertTo[JsArray].elements
        val messageService = actorRefFactory.actorOf(Props(new MessageProcessingServicev2()))
        val avroService = actorRefFactory.actorOf(Props(new AvroSchemaService()))
        val validationService = actorRefFactory.actorOf(Props(new JSONMessageValidationService()))

        implicit val timeout = Timeout(5 seconds)

        val future = avroService ? AvroSchema.MemberSchema(requestContext)
        val memberSchema:Schema = Await.result(future, timeout.duration).asInstanceOf[Schema]

        for (member <- membersJson) validationService ! ValidationService.MemberValidation(member.asJsObject, memberSchema, requestContext)

        for (member <- membersJson) (messageService ! MessageProcessingv2.ProcessMember(member.asJsObject, topicName, memberSchema, requestContext))

我已经浏览了很多关于这个主题的博客/书籍/幻灯片,并且不确定最佳方法是什么。我一直在使用Scala / Akka大约2个月,基本上只是自我教授我需要的部分。因此,对于经验较丰富的Scala / Akka / Spray开发人员在此有任何见解,我们非常感激。我认为的那个人就是将3个演员包装成一个“大师”演员并让每个演员成为那个演员的孩子并尝试接近它。

1 个答案:

答案 0 :(得分:0)

当您使用异步处理(!)时,您无法在发送消息后控制处理。您需要使用ask(?)来返回您可以使用的未来。

但我有一个更好的主意。您可以从第一个演员发送消息到第二个演员。而不是将结果返回给第一个actor,您可以将消息发送给第三个,以继续计算。