1

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

我知道,在 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.

4

2 回答 2

0

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

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

于 2012-07-01T21:59:55.633 回答
-1

尝试检查堆栈跟踪:new Throwable().getStackTrace()。这将返回一个数组StackTraceElement。您可以遍历数组并识别从队列中调用的典型类+方法。

于 2012-04-22T13:42:49.460 回答