我正在为移动应用程序(目前正在Play 2.1.1上运行)的后端工作。作为处理某些请求的一部分,我们发送推送通知。发送推送通知的下游请求应该完全异步,并与移动客户端的原始请求响应分离。
我希望Http.Context.current()在发送下游请求时能够访问,以便访问我们在请求标头中传递的某些跟踪信息。
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 …Run Code Online (Sandbox Code Playgroud) 在示例应用程序上从Play 2.4升级到Play 2.5后,当我运行时./activator clean dist,我没有遇到任何错误,但是在转到特定端点后http://localhost:9000/java/proxy,我收到以下错误:
[error] application -
! @72keog237 - Internal server error, for (GET) [/java/proxy] ->
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.RuntimeException: There is no HTTP Context available from here.]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:293)
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:220)
at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160)
at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188)
at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:100)
at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100)
at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99)
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344)
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
Caused by: java.util.concurrent.CompletionException: java.lang.RuntimeException: There is no HTTP Context available from here.
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)
at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:604)
at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577)
... 5 common frames omitted
Caused …Run Code Online (Sandbox Code Playgroud)