我可以从任意异步任务访问Http.Context.current()吗?

Dav*_*ron 5 java akka playframework playframework-2.1

我正在为移动应用程序(目前正在Play 2.1.1上运行)的后端工作。作为处理某些请求的一部分,我们发送推送通知。发送推送通知的下游请求应该完全异步,并与移动客户端的原始请求响应分离。

我希望Http.Context.current()在发送下游请求时能够访问,以便访问我们在请求标头中传递的某些跟踪信息。

最初,代码遵循Play中的建议,看起来像这样说明文件

PushNotificationRunnable sendNotificationTask = new ...    
Akka.system().scheduler().scheduleOnce(Duration.apply(0, TimeUnit.MICROSECONDS),
    sendNotificationTask, Akka.system().dispatcher());
Run Code Online (Sandbox Code Playgroud)

探索play.libs.Akka帮助程序将我带到将来的方法,该方法采用可调用的方法并返回Promise。这个承诺使我可以链接更多代码。在这里Callback,由于在Play的class中设置了代码,我已经链接了一个可以访问Http.Context.current()PromiseActor。这使我可以在任务完成时记录一行,包括跟踪ID,但是在任务执行期间我的日志行仍然无法访问跟踪信息。

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");
    }
});
Run Code Online (Sandbox Code Playgroud)

这是一些简短的应用程序日志,以显示我当前所在的位置以及缺少的内容,第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
Run Code Online (Sandbox Code Playgroud)

这些字段是日期,时间,级别,线程和跟踪ID。使用此logback配置是否有帮助:

%d{ISO8601} %-5level %thread %traceId [%logger] : %msg%n
Run Code Online (Sandbox Code Playgroud)

如您所见,第3行和第4行来自Akka线程,无权访问TraceId,而不是print n/a。第1行和第2行位于初始请求处理线程上,并且具有访问权限。最后,第5行位于不同的请求处理线程上,并且也具有访问权限。

有什么其他方法可以安排任务使它可以访问Http.Context.request(),但仍可以在请求-响应循环的“外部”运行浏览器吗?