【发布时间】:2014-11-21 07:17:17
【问题描述】:
在调用休息 api 时,我想将演员的路由切换到另一个路由。 请看下面的代码。
几个问题:
- 代码编译正常,但是当应用程序启动并进行 http 调用时,我得到配置的注册超时 1 秒过期,停止消息,我没有从服务器得到任何响应。
- 我希望能够通过 api 将路由切换到另一组路由。
制造
package com.example
import akka.actor.Actor
import akka.io.IO
import spray.httpx.RequestBuilding._
import spray.http.MediaTypes._
import spray.routing.{RoutingSettings, RejectionHandler, ExceptionHandler, HttpService}
import spray.util.LoggingContext
import scala.concurrent.Future
import spray.can.Http
import spray.http._
import akka.util.Timeout
import HttpMethods._
import akka.pattern.ask
import akka.event.Logging
import scala.concurrent.duration._
case object Swap
class MyServiceActor extends Actor with MyService with akka.actor.ActorLogging {
implicit def actorRefFactory = context
import context._
def receive = {
case Swap =>
become {
case Swap => unbecome()
case _ => runRoute(otherRoutes)
}
case _ => runRoute(myRoute)
}
}
trait MyService extends HttpService { this: MyServiceActor =>
implicit val timeout: Timeout = Timeout(15.seconds)
implicit val system = context.system
val myRoute =
{
path("") {
get {
complete("MyRoute")
}
} ~ path("swap") {
get{
self ! Swap
complete("Swapped")
}
}
}
val otherRoutes =path("") {
get {
complete("OtherRoutes")
}
} ~ path("swap") {
get{
self ! Swap
complete("Reverted")
}
}
}
【问题讨论】:
-
我没有发现明显的问题。您收到的错误消息似乎表明您的演员由于某种原因没有处理
Connected消息。 -
如果我将接收方法更改为 def receive =runRoute(myRoute) 服务器响应没有任何问题。
-
是的,另一个答案解释了原因:您需要通过路由传递实际消息。