Com a introdução do agente Java versão 7.8.0, foram feitas alterações em remove a instrumentação padrão do método bindAndHandle
, para eliminar cenários que poderiam resultar no relato de transações duplicadas erroneamente. Em algumas situações, pode ser necessário fazer chamadas de método explícitas para compensar essa alteração.
Antecedentes: instrumentação HttpExt
A instrumentação para Akka HTTP Core é realizada na classe akka.http.scaladsl.HttpExt
que serve como ponto de entrada principal para um servidor. Dois métodos convenientes de HttpExt
que podem ser usados para iniciar um servidor HTTP foram instrumentados:
bindAndHandleAsync
: um método de conveniência que inicia um novo servidor HTTP em um determinado endpoint e usa um manipulador que é uma função que recebe umHttpRequest
e retorna umFuture[HttpResponse]
bindAndHandleSync
: um método de conveniência que inicia um novo servidor HTTP em um determinado endpoint e usa um manipulador que é uma função que recebe umHttpRequest
e retorna umHttpResponse
Para evitar que a duplicação errônea de transação seja reportada, está sendo aplicada instrumentação no longer ao método bindAndHandle
, que inicia um novo servidor HTTP usando uma instância akka.stream.scaladsl.Flow
.
A duplicação da transação se deve a um conflito na instrumentação DSL do Akka Http Routing.
Solução - chame explicitamente bindAndHandleAsync
Se desejar iniciar um servidor HTTP a partir de um akka.stream.scaladsl.Flow
, você deverá invocar explicitamente o método bindAndHandleAsync
. Por exemplo:
val flow: Flow[HttpRequest, HttpResponse, NotUsed] = ???val asyncHandler: HttpRequest => Future[HttpResponse] = request => Source.single(request).via(flow).runWith(Sink.head)
Http().bindAndHandleAsync(asyncHandler, host, port)
Importante
Uma solução alternativa semelhante, chamar bindAndHandle
ao iniciar um servidor HTTP a partir de um akka.http.scaladsl.Route
usando o Akka HTTP Routing DSL, não é necessária. a instrumentação de agente funcionará normalmente quando for chamada de outros métodos de conveniência.