我们正在考虑使用 Akka-HTTP Java API - 使用路由 DSL。
不清楚如何使用路由功能来响应 HttpRequest;使用无类型 Akka Actor。
例如,在匹配 Route 路径后,我们如何将请求传递给“处理程序”ActorRef,然后该处理程序将以异步方式响应 HttpResponse?
Akka-User 邮件列表上发布了类似的问题,但没有后续解决方案 -https://groups.google.com/d/msg/akka-user/qHe3Ko7EVvg/KC-aKz_o5aoJ.
这可以通过组合来完成onComplete指令和ask图案。
在下面的示例中RequestHandlerActor
actor 用于创建一个HttpResponse
基于HttpRequest
。该 Actor 是从路线内询问的。
我从未使用过 Java 来路由代码,所以我的回答是使用 Scala。
import scala.concurrent.duration._
import akka.actor.ActorSystem
import akka.http.scaladsl.model.HttpResponse
import akka.http.scaladsl.model.HttpRequest
import akka.actor.Actor
import akka.http.scaladsl.server.Directives._
import akka.actor.Props
import akka.pattern.ask
import akka.util.Timeout
import scala.util.{Success, Failure}
import akka.http.scaladsl.model.StatusCodes.InternalServerError
class RequestHandlerActor extends Actor {
override def receive = {
case httpRequest : HttpRequest =>
sender() ! HttpResponse(entity = "actor responds nicely")
}
}
implicit val actorSystem = ActorSystem()
implicit val timeout = Timeout(5 seconds)
val requestRef = actorSystem actorOf Props[RequestHandlerActor]
val route =
extractRequest { request =>
onComplete((requestRef ? request).mapTo[HttpResponse]) {
case Success(response) => complete(response)
case Failure(ex) =>
complete((InternalServerError, s"Actor not playing nice: ${ex.getMessage}"))
}
}
然后可以使用该路由传递到bindAndHandle方法与任何其他流一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)