我如何在代码深处可靠地检测是否从任务队列中调用当前的处理程序调用?
我理解,在GAE / J中,如果我检查了HttpServletRequest
对象,我可以检查是否设置了following headers:
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还是在开发服务器上执行的方式。
答案 0 :(得分:0)
我最终检查了请求的标头是否包含X-AppEngine-TaskName
,并且,由于AlexR的建议,将检查结果存储在线程局部变量中。
根据下面的Eric Willigers评论,结果显示Google已经从外部请求中丢弃X-AppEngine-TaskName
标头,保护应用免受试图伪造标头的恶意攻击者的攻击,因此这似乎是迄今为止最安全的方法。 / p>
答案 1 :(得分:-1)
尝试检查堆栈跟踪:new Throwable().getStackTrace()
。这将返回StackTraceElement
的数组。您可以迭代数组并标识从队列调用的典型类+方法。