我正在尝试在Scala上实现AKKA http和一些演员。 我用akka创建了一个web应用程序。 但我在一个或两个不同的路线/ 16上有这个错误。 (显然是随机的):
服务器无法及时回复您的请求。 请稍后再试一次!
你能解释一下为什么以及如何解决这个问题? 我真的是阿卡的新手。
主要课程:
object WebServer extends App {
implicit val system = ActorSystem("app-1")
implicit val materializer = ActorMaterializer()
// needed for the future flatMap/onComplete in the end
implicit val executionContext = system.dispatcher
val routes = SessionRoute.route
val bindingFuture = Http().bindAndHandle(routes, ipServer, configApplication.getInt("spray.can.client.proxy.http.port"))
println("serv http launch")
StdIn.readLine
bindingFuture
.flatMap(_.unbind()) // trigger unbinding from the port
.onComplete(_ => {
cluster.close()
system.terminate()
})
bindingFuture.onFailure {
case ex: Exception =>
println(ex, "Failed to bind to {}:{}!", ipServer, configApplication.getInt("spray.can.client.proxy.http.port"))
}
}
我的路线是:
object SessionRoute extends TokenValidator {
implicit val formats = org.json4s.DefaultFormats
val sessionHandler = WebServer.system.actorOf(SessionHandler.props(), "SessionHandler")
implicit val timeout = Timeout(60.seconds)
val route: Route = get {
authenticated(doAuthPublisher) { app =>
getActiveUserPublisher
}
}
def getActiveUserPublisher =
path("session" / JavaUUID / "active_user") { publisher_id =>
parameters('date_start.as[Long], 'date_end.as[Long]) {
(date_start, date_end) => {
onSuccess(sessionHandler ? SessionActiveUser(SessionRequest(publisher_id, date_start, date_end, null))) {
case response: Answer =>
complete(StatusCodes.OK, response.result)
case _ =>
complete(StatusCodes.InternalServerError, "Error on the page")
}
}
}
}
}
我的演员是:
object SessionHandler {
def props(): Props = {
Props(classOf[SessionHandler])
}
}
class SessionService(implicit actorSystem: ActorSystem) extends toolService {
def activeUser(sessionRequest: SessionRequest): Map[String, Any] = {
....
}
}
class SessionHandler extends Actor with ActorLogging {
implicit val system = ActorSystem("session")
implicit val formats = org.json4s.DefaultFormats
def receive: Receive = {
case request: SessionActiveUser =>
sender() ! Answer(Serialization.write(new SessionService().activeUser(request.sessionRequest)))
}}
我的案例类使用了:
final case class Answer(result: String)
case class SessionActiveUser(sessionRequest: SessionRequest)
case class SessionRequest(publisher_id: UUID = null, date_start: Long, date_end: Long, app_id: String = null)
我的configuration.conf:
akka {
loglevel = INFO
stdout-loglevel = INFO
loggers = ["akka.event.slf4j.Slf4jLogger"]
default-dispatcher {
fork-join-executor {
parallelism-min = 8
}
}
// event-handlers = ["akka.event.slf4j.Slf4jLogger"]
}