如何在代码深处可靠地检测处理程序的当前调用是否是从任务队列调用的?
据我了解,在 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/