2016-03-29 3 views
7

Предположим, что я создал произвольно сложный Flow[HttpRequest, HttpResponse, Unit].akka-http: полный запрос с потоком

я уже могу использовать вышеуказанный поток для обработки входящих запросов с

Http().bindAndHandle(flow, "0.0.0.0", 8080) 

Теперь я хотел бы добавить протоколирование, используя некоторые существующие директивы, как logRequestResult("my-service"){...} Есть ли способ объединить эту директиву с моим потоком? Я думаю, что я ищу другую директиву, что-то вроде строк

def completeWithFlow(flow: Flow): Route 

Возможно ли это вообще?

N.B .: logRequestResult - пример, мой вопрос относится к любой Директиве, которая может оказаться полезной.

+0

Почему регистрация должна предоставляться Директивой? Почему вы не можете использовать Flow.log? –

+0

Да, я мог бы использовать Flow.log для этого конкретного примера. мой вопрос был несколько более общим, как в: если у меня есть готовая к использованию директива, которую я бы хотел использовать, как я могу ее повторно использовать в моем контексте? Скажем, я хочу, чтобы обрабатывать запросы .favicon используя директивы ниже пути ("favicon.ico") { getFromResource ("favicon.ico", 'образ/х-icon') } Я хотел бы быть способный использовать эту директиву в сочетании с моим потоком, например используйте мой поток, чтобы обслуживать определенный путь, и используйте приведенную выше директиву для обслуживания/favicon. –

ответ

4

Оказывается, один (и, возможно, единственный) способ заключается в проволоке и материализовать новый поток, и кормить извлеченный запрос на него. Пример ниже

val myFlow: Flow[HttpRequest, HttpResponse, NotUsed] = ??? 

    val route = 
    get { 
     logRequestResult("my-service") { 
     extract(_.request) { req ⇒ 
      val futureResponse = Source.single(req).via(myFlow).runWith(Sink.head) 
      complete(futureResponse) 
     } 
     } 
    } 

    Http().bindAndHandle(route, "127.0.0.1", 9000) 
0

http://doc.akka.io/docs/akka/2.4.2/scala/http/routing-dsl/overview.html

Вы ищете route2HandlerFlow или Route.handlerFlow?

Я считаю, что Route.handlerFlow будет работать на основе implicit.

например/

val serverBinding = Http().bindAndHandle(interface = "0.0.0.0", port = 8080, 
handler = route2HandlerFlow(mainFlow())) 
+0

Спасибо, я на самом деле ищу обратное. –

+1

:) Всегда рад помочь ... кому-то ... возможно –

Смежные вопросы