5

私は、現在 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() にアクセスできるCallbackaをチェーンしました。これにより、タスクの完了時にトレース 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() へのアクセスを許可するタスクをスケジュールする別の方法がありますが、ブラウザへの要求応答ループの「外側」で実行しますか?

4

0 に答える 0