java - 如何可靠地检测任务队列中的代码是否正在执行?

标签 java google-app-engine task-queue

如何在代码深处可靠地检测处理程序的当前调用是否是从任务队列调用的?

据我了解,在 GAE/J 中,如果我检查 HttpServletRequest 对象,我可以检查 following headers 是否设置:

  • X-AppEngine-QueueName
  • X-AppEngine-TaskName
  • X-AppEngine-TaskRetryCount
  • X-AppEngine-FailFast
  • X-AppEngine-TaskETA

任何这些 header 的存在都表明处理程序正在由任务队列调用。

但是,假设我的代码中需要进行检测的部分位于多个抽象层深处,我无法访问 HttpServletRequest 对象,有什么方法可以可靠地检测是否当前执行环境是否正在从任务队列中调用?

我希望能够有一些易于访问的东西,例如:

SystemProperty.environment.value() == Value.TaskQueue

类似于我们可以使用 SystemProperty.environment.value() == Value.Development 检查代码是在 GAE 还是在开发服务器上执行的方式。

最佳答案

我最终检查了请求的 header 是否包含 X-AppEngine-TaskName ,并且感谢 AlexR 的建议,将检查结果存储在线程局部变量中。

根据下面的 Eric Willigers 评论,事实证明 Google 已经从外部请求中丢弃了 X-AppEngine-TaskName header ,从而保护应用程序免受试图伪造 header 的恶意攻击者的侵害,因此这似乎是迄今为止最安全的方法。

关于java - 如何可靠地检测任务队列中的代码是否正在执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10268331/

相关文章:

java - 确保 NodeJS 生成 std​​out.on 仅在换行符上激活

java - Axis、Java 消息传递服务和 MIME header

java - maven-shade-plugin:排除依赖项及其所有传递依赖项

java - Google App Engine Java 无法运行应用程序 HTTP 500

python - Google App Engine SSL 版本 2.7.11 库不受/支持

python - 任务队列 : Allow only one task at a time per user

java - Android TimeZone.getAvailableIDs() 产生奇怪的字符串

google-app-engine - (gcloud.app.deploy) 错误响应 : [13] Unexpected Error

java - 有没有办法使用 App Engine Java 运行时动态设置任务的目标?

python - 在 Celery Task Queue 中,在一个组中运行的任务与循环中的多个异步任务有什么不同吗?