Scala 在喷洒路线上呼叫演员并等待演员';s的反应

Scala 在喷洒路线上呼叫演员并等待演员';s的反应,scala,akka,actor,spray,Scala,Akka,Actor,Spray,玩过之后!框架一段时间后,我第一次看到喷雾。我从我在GitHub上找到的一个示例开始,现在我想修改它,但要了解它的工作原理并不容易 我如何在下面的代码中等待参与者的消息 package api import akka.actor.ActorRef import scala.concurrent.ExecutionContext import spray.routing.Directives import core.ClassifierActor class ClassifierService

玩过之后!框架一段时间后,我第一次看到喷雾。我从我在GitHub上找到的一个示例开始,现在我想修改它,但要了解它的工作原理并不容易

我如何在下面的代码中等待参与者的消息

package api

import akka.actor.ActorRef
import scala.concurrent.ExecutionContext
import spray.routing.Directives
import core.ClassifierActor

class ClassifierService(classifier: ActorRef)(implicit executionContext: ExecutionContext)
  extends Directives with DefaultJsonFormats {

  import ClassifierActor._

  implicit val classifyMessageFormat = jsonFormat4(ClassifyMessage)

  val route =
    path("classify") {
      post {
        handleWith { 
          // The ClassifierActor gets a ClassifyMessage and 
          // sends a ClassifiedMessage back to the sender.
          // How can wait for the ClassifiedMessage here 
          // and send a HttpResponse back?
          cm: ClassifyMessage => classifier ! cm
          // ???
        }
      }
    }

}

Spray已经基于akka.io

因此,如果您只想通过参与者响应来完成您的路线,您可以使用ask模式

import akka.pattern.ask  
import scala.concurrent.duration._
implicit val timeout = Timeout(5 seconds) // needed for `?` below

 val route =
    path("classify") {
      post {
        onComplete(actorResponse(yourActor, yourMessage)) {
          complete(_)
        }
      }
    }

def actorResponse[T](actor: ActorRef, msg: ClassifyMessage): Future[T] = 
(actor ? msg).mapTo[T]

若您想将请求转发到您的actor模型并完成actor系统中某个地方的路由,那个么您需要将RequestContext转发给actor。也许,这可以帮助你。祝你好运

看看我的示例项目。使用期货完成路线。正如Rup所评论的,等待响应是不好的做法。立即返回一个未来,并在得到结果时让它完成


在您的示例中,
分类器!cm正在使用参与者“告诉”模式。它将一条消息
cm
发送到
分类器
参与者并继续。如果您希望它在将来得到响应,请使用“ask”模式:
分类器?cm
。在您的
cm
actor的接收方法中,您将返回与
sender的未来!responseMsg
它将在将来返回。

我没有编写路由代码,所以我不知道最好的方法,但大体上你从不等待:相反,你将请求交给一个参与者,或者可能是一个参与者,该参与者通过tell包装在未来,负责在处理完成后发送回复。我是一个新手,所以我不能从你的答复中得到任何好处。我需要一段代码。谢谢!您可以添加“import scala.concurrent.Future”,因为Java也有未来。和“import akka.actor.actor”只是因为它也是必需的。一个重要的注意事项是:此人已经在使用actors(请参阅q中的“分类器:ActorRef”)。如果你只是想寻找一种多线程响应逻辑的方法,那么未来的[HttpResponse]才是方向,而不是参与者。看见