Avec l'introduction de agent Java sortie 7.8.0, des modifications ont été apportées à remove l'instrumentation par défaut de la méthode bindAndHandle
, afin d'éliminer les scénarios qui pourraient entraîner la déclaration de transactions dupliquées par erreur. Dans certaines situations, il peut être nécessaire d'effectuer des appels de méthode explicites pour compenser ce changement.
Contexte : instrumentationHttpExt
L'instrumentation pour Akka HTTP Core est réalisée dans la classe akka.http.scaladsl.HttpExt
qui sert de point d'entrée principal pour un serveur. Deux méthodes pratiques de HttpExt
qui peuvent être utilisées pour démarrer un serveur HTTP ont été instrumentées :
bindAndHandleAsync
: Une méthode pratique qui démarre un nouveau serveur HTTP au point de terminaison donné et utilise un gestionnaire qui est une fonction recevant unHttpRequest
et renvoyant unFuture[HttpResponse]
bindAndHandleSync
: Une méthode pratique qui démarre un nouveau serveur HTTP au point de terminaison donné et utilise un gestionnaire qui est une fonction recevant unHttpRequest
et renvoyant unHttpResponse
Pour éliminer la duplication erronée des transactions signalées, l'instrumentation est no longer appliquée à la méthode bindAndHandle
, qui démarre un nouveau serveur HTTP à l'aide d'une instance akka.stream.scaladsl.Flow
.
La duplication des transactions est due à un conflit dans l'instrumentation DSL Akka Http Routing.
Solution - appeler explicitement bindAndHandleAsync
Si vous souhaitez démarrer un serveur HTTP à partir d'un akka.stream.scaladsl.Flow
, vous devez appeler explicitement la méthode bindAndHandleAsync
. Par exemple:
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)
Important
Une solution de contournement similaire, appelant bindAndHandle
lors du démarrage d'un serveur HTTP à partir d'un akka.http.scaladsl.Route
à l'aide du DSL de routage HTTP Akka, n'est pas nécessaire. instrumentation de l'agent fonctionnera normalement lorsqu'elle sera appelée à partir d'autres méthodes pratiques.