Преобразование маршрута в поток в Akka-Http для Java

Есть ли способ конвертировать javadsl Route в Flow? В Scala у нас неявно доступен handlerFlow, но в Java у нас нет аналогов.

Пытался вызвать handlerFlow, но он использует типы scaladsl и несовместим с версией Route для javadsl.

Я хочу использовать низкоуровневую версию API для возможности привязки к http и https и для доступа к соединениям.

==========================
Обновление: я использовал идею из ответа svezfaz, и теперь я получаю код:

Flow<HttpRequest, HttpResponse, NotUsed> createFlow(ActorSystem system, Materializer mat) {
  scala.Function1<akka.http.scaladsl.server.RequestContext, scala.concurrent.Future<akka.http.scaladsl.server.RouteResult>> r = RouteImplementation.apply(createRoute());
  Flow f = RouteResult$.MODULE$.route2HandlerFlow(
      r,
      RoutingSettings$.MODULE$.apply(system),
      ParserSettings$.MODULE$.apply(system),
      mat,
      RoutingLog$.MODULE$.fromActorSystem(system),
      null,
      RejectionHandler$.MODULE$._mthdefault(),
      null
      ).asJava();
  return f;
}

Выглядит правильно, но не компилируется. Возможно, мне нужно включить библиотеку Scala в путь к классам. А затем немного поработайте с другими преобразованиями типов Scala в Java.

Я думаю, что проще переписать его без маршрутов на Java.


person EuDgee    schedule 15.04.2016    source источник


Ответы (2)


В akka-http 10.0.6 вы можете использовать

akka.http.scaladsl.server.Route.handlerFlow(route: Route): Flow[HttpRequest, HttpResponse, NotUsed]

Необходимы некоторые имплициты, но их легко включить в область видимости.

person Cyrille Corpet    schedule 24.05.2017

Вы можете черпать вдохновение из akka.http.javadsl.server.HttpServiceBase (см. ниже). Используйте RouteImplementation для преобразования javadsl в scaladsl, затем вызовите route2HandlerFlow для преобразования в поток.

  /**
   * Uses the route to handle incoming connections and requests for the ServerBinding.
   */
  def handleConnectionsWithRoute(interface: String, port: Int, route: Route, system: ActorSystem, materializer: Materializer): CompletionStage[ServerBinding] = {
    implicit val s = system
    implicit val m = materializer

    import system.dispatcher
    val r: server.Route = RouteImplementation(route)
    Http(system).bind(interface, port).toMat(Sink.foreach(_.handleWith(akka.http.scaladsl.server.RouteResult.route2HandlerFlow(r))))(Keep.left).run()(materializer).toJava
  }
person Stefano Bonetti    schedule 15.04.2016