Con la introducción del agente de Java versión 7.8.0, Se realizaron cambios en remove la instrumentación predeterminada del método bindAndHandle
, para eliminar escenarios que podrían resultar en que se reporten transacciones duplicadas erróneamente. En algunas situaciones, puede que sea necesario realizar llamadas explícitas a métodos para compensar este cambio.
Antecedentes: instrumentación HttpExt
La instrumentación para Akka HTTP Core se lleva a cabo en la clase akka.http.scaladsl.HttpExt
que sirve como punto de entrada principal para un servidor. Se han instrumentado dos métodos convenientes de HttpExt
que se pueden utilizar para iniciar un servidor HTTP:
bindAndHandleAsync
: Un método conveniente que inicia un nuevo servidor HTTP en el extremo dado y utiliza un controlador que es una función que recibe unHttpRequest
y devuelve unFuture[HttpResponse]
bindAndHandleSync
: Un método conveniente que inicia un nuevo servidor HTTP en el extremo dado y utiliza un controlador que es una función que recibe unHttpRequest
y devuelve unHttpResponse
Para evitar que se informe la duplicación errónea de transacciones, se está aplicando instrumentación no longer al método bindAndHandle
, que inicia un nuevo servidor HTTP utilizando una instancia akka.stream.scaladsl.Flow
.
La duplicación de la transacción se debe a un choque en la instrumentación DSL de Akka Http Routing.
Solución: llamar explícitamente a bindAndHandleAsync
Si desea iniciar un servidor HTTP desde un akka.stream.scaladsl.Flow
, debe invocar explícitamente el método bindAndHandleAsync
. Por ejemplo:
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
No es necesaria una solución alternativa similar, llamar bindAndHandle
al iniciar un servidor HTTP desde un akka.http.scaladsl.Route
utilizando el DSL de enrutamiento HTTP de Akka. La instrumentación del agente funcionará normalmente cuando se llame desde otros métodos convenientes.