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

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

我想在发送下游请求时访问Http.Context.current()以访问我们在请求标头中传递的一些跟踪信息。

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

 PushNotificationRunnable sendNotificationTask = new ... Akka.system().scheduler().scheduleOnce(Duration.apply(0, TimeUnit.MICROSECONDS), sendNotificationTask, Akka.system().dispatcher()); 

探索play.libs.Akka帮助器引导我进入future方法,该方法采用可调用方式并返回Promise。 这个承诺允许我链接更多的代码。 在这里,我已经链接了一个Callback ,它可以访问Http.Context.current(),这要归功于Play的PromiseActor类中的设置代码。 这允许我在任务完成时记录一行,包括跟踪ID,但在任务期间我的日志行仍然无法访问跟踪信息。

 PushNotificationCallable sendNotificationTask = new ... Akka.future(sendNotificationTask).onRedeem(new F.Callback() { @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。 使用此logback配置,如果它有帮助:

 %d{ISO8601} %-5level %thread %traceId [%logger] : %msg%n 

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

是否有一些不同的方式我可以安排任务,使其可以访问Http.Context.request(),但仍然会在请求 – 响应循环的“外部”运行它到浏览器?