我希望在我的(Java)代码周围添加一些防御性的异常处理/重试逻辑,以便在应用程序引擎中对任务进行排队。在审查文档中提出的潜在异常时,我看到了几个候选者,这些候选者可能有意义通过重试来捕获和处理,但文档有点模糊,所以我想看看其他人认为有什么值得。
以下是我正在查看的,以及文档中对它们的描述:
- InternalFailureException-内部任务队列错误
- TransientFailureException-间歇性故障
- QueueFailureException-未指定的队列故障
- TransactionalTaskException-由数据存储异常引起的队列操作失败
文档中唯一明确建议重试可能有帮助的是TransientFailureException。
此外,关于TransactionalTaskException,这是只有在将任务登记到封闭的数据存储事务中时才会出现的情况,还是在将独立任务排入队列时会出现的情况?
我在应用引擎谷歌小组中得到了一些关于这个问题的反馈(请参阅本线程),所以我想我应该在这里发布一个摘要,以造福他人。
对GAE来源的一些检查显示:
- 内部错误代码TASK_ALREADY_EXISTS和TOMBSTONED_TASK都映射到TaskAlreadyExistsException
- TransactionalTaskException用于出现的所有数据存储错误
- QueueFailureException是没有显式映射异常类型的任何内部错误代码的catch-all异常
Robert Kluin也给出了以下建议(转述如下):
- 考虑处理TaskAlreadyExistsException。重试是没有意义的,但在某些情况下,您可能想要接受错误,而在其他情况下,则会引发错误
- 考虑超过处理期限和超时。特别是,他提到超时可以伪装成内部错误(Java中的InternalFailureException)