Scala 在喷洒路线上呼叫演员并等待演员';s的反应
玩过之后!框架一段时间后,我第一次看到喷雾。我从我在GitHub上找到的一个示例开始,现在我想修改它,但要了解它的工作原理并不容易 我如何在下面的代码中等待参与者的消息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
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]才是方向,而不是参与者。看见