[英]How to reliably detect that the code is being executed from task queue or not?
如何在我的代码深处可靠地检测是否从任务队列中调用了处理程序的当前调用?
我了解,在GAE / J中,如果检查了HttpServletRequest
对象,则可以检查是否设置了以下标头 :
X-AppEngine-QueueName
X-AppEngine-TaskName
X-AppEngine-TaskRetryCount
X-AppEngine-FailFast
X-AppEngine-TaskETA
这些标头中的任何一个标头的存在将表明该处理程序正在由任务队列调用。
但是要说的是,我的代码中需要进行检测的部分位于几个抽象层的深处,我无法访问HttpServletRequest
对象,有什么方法可以可靠地检测当前是否从任务中调用了当前执行环境。排队与否?
我希望有一种容易获得的东西:
SystemProperty.environment.value() == Value.TaskQueue
类似于我们可以使用SystemProperty.environment.value() == Value.Development
检查代码是在GAE还是在开发服务器上执行的SystemProperty.environment.value() == Value.Development
。
我最终检查了请求的标头是否包含X-AppEngine-TaskName
TaskName,并且由于AlexR的建议,将检查结果存储在线程局部变量中。
根据以下Eric Willigers的评论,事实证明Google已经从外部请求中丢弃了X-AppEngine-TaskName
标头,从而保护了应用程序免受试图伪造标头的恶意攻击者的侵害,因此,这似乎是迄今为止最安全的方法。
尝试检查堆栈跟踪: new Throwable().getStackTrace()
。 这将返回一个StackTraceElement
数组。 您可以遍历数组,并确定从队列调用典型的类+方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.