Javaエージェントリリース7.8.0の導入により、 誤って重複したトランザクションが報告される可能性があるシナリオを排除するために、 bindAndHandle
メソッドのデフォルトのインストゥルメンテーションremoveに変更が加えられました。 状況によっては、この変更を補正するために明示的なメソッド呼び出しを行う必要がある場合があります。
背景:HttpExtインストルメンテーション
Akka HTTP Coreのインストルメンテーションは、サーバーのメインエントリポイントとして機能するakka.http.scaladsl.HttpExt
クラスで実行されます。HTTPサーバーの起動に使用できるHttpExt
の2つの便利なメソッドが装備されています。
bindAndHandleAsync
:指定されたエンドポイントで新しいHTTPサーバーを起動し、HttpRequest
を受信してFuture[HttpResponse]
bindAndHandleSync
:指定されたエンドポイントで新しいHTTPサーバーを起動し、HttpRequest
を受信してHttpResponse
トランザクションの誤った重複が報告されないようにするために、 bindAndHandle
メソッドにインストルメンテーションがno longer適用され、 akka.stream.scaladsl.Flow
インスタンスを使用して新しい HTTP サーバーが起動されます。
トランザクションの重複は、Akka HttpRoutingDSLインストルメンテーションの衝突によるものです。
解決策-bindAndHandleAsyncを明示的に呼び出します
akka.stream.scaladsl.Flow
からHTTPサーバーを起動する場合は、 bindAndHandleAsync
メソッドを明示的に呼び出す必要があります。例えば:
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)
重要
Akka HTTP Routing DSLを使用してakka.http.scaladsl.Route
からHTTPサーバーを起動するときにbindAndHandle
を呼び出すという、同様の回避策は必要ありません。エージェントインストルメンテーションは、他の便利なメソッドから呼び出されたときに正常に機能します。