私は、現在 Play 2.1.1 で実行されているモバイル アプリのバックエンドに取り組んでいます。一部のリクエストを処理する一環として、プッシュ通知を送信します。プッシュ通知を送信するためのダウンストリーム リクエストは、完全に非同期であり、モバイル クライアントの元のリクエスト/レスポンスから切り離されている必要があります。
Http.Context.current()
リクエスト ヘッダーで渡すトレース情報にアクセスするために、ダウンストリーム リクエストの送信中ににアクセスしたいと考えています。
もともと、コードは次のようで、Play! ドキュメンテーション:
PushNotificationRunnable sendNotificationTask = new ...
Akka.system().scheduler().scheduleOnce(Duration.apply(0, TimeUnit.MICROSECONDS),
sendNotificationTask, Akka.system().dispatcher());
ヘルパーを調べると、 callableplay.libs.Akka
を受け取り、Promise を返す future メソッドにたどり着きました。この約束により、さらにコードを連鎖させることができます。ここでは、 Play のclassにコードを設定したおかげでHttp.Context.current() にアクセスできるCallback
aをチェーンしました。これにより、タスクの完了時にトレース ID を含む行をログに記録できますが、タスク中のログ行は依然としてトレース情報にアクセスできません。PromiseActor
PushNotificationCallable sendNotificationTask = new ...
Akka.future(sendNotificationTask).onRedeem(new F.Callback<Void>() {
@Override
public void invoke(Void aVoid) throws Throwable {
Logger.info("Completed sendNotificationTask from the service");
}
});
以下は、私が現在どこにいるのか、何が欠けているのかを示すために、大幅に簡略化されたアプリケーション ログです。5 列目にトレース ID があります。
2013-07-26 11:31:06,885 DEBUG play-akka.actor.default-dispatcher-10 -2454018518484259555 [application] : Processing request for mobile app
2013-07-26 11:31:06,907 DEBUG play-akka.actor.default-dispatcher-10 -2454018518484259555 [application] : About to schedule push notification message send
2013-07-26 11:31:06,907 INFO application-akka.actor.default-dispatcher-8 n/a [services.PushMessageSenderTask] : Sending message in akka background task
2013-07-26 11:31:06,924 INFO application-akka.actor.default-dispatcher-8 n/a [services.PushMessageSenderTask] : Sent message in akka background task
2013-07-26 11:31:06,925 INFO play-akka.actor.default-dispatcher-16 -2454018518484259555 [application] : Completed sendNotificationTask
フィールドは、日付、時刻、レベル、スレッド、およびトレース ID です。このログバック構成が役立つ場合:
%d{ISO8601} %-5level %thread %traceId [%logger] : %msg%n
ご覧のとおり、3 行目と 4 行目は Akka スレッドからのもので、printing の代わりに TraceId にアクセスできませんn/a
。1 行目と 2 行目は最初の要求処理スレッドにあり、アクセスできます。最後に、5 行目は別の要求処理スレッド上にあり、アクセス権も持っています。
Http.Context.request() へのアクセスを許可するタスクをスケジュールする別の方法がありますが、ブラウザへの要求応答ループの「外側」で実行しますか?