【问题标题】:App Engine with Java: Deferred tasks ignoring retry limit带有 Java 的 App Engine:忽略重试限制的延迟任务
【发布时间】:2016-01-11 11:54:48
【问题描述】:

我有一个 cron 作业,它启动一个在单独队列中运行的延迟任务。我已将此队列的重试限制设置为 1。由于此任务使用大量数据存储调用,我不希望它在发生故障时继续重试。

尽管我的 queue.yaml 定义如下,但延迟任务似乎继续重试:

queue:
- name: stopretrying   
rate: 35/s   
max_concurrent_requests: 2           
retry_parameters:
    task_retry_limit: 1
    task_age_limit: 1d

谁能解释这种叛逆行为?

谢谢你,美好的一天

【问题讨论】:

  • 您是否确认它正在重试处理程序 (cron) 未重新安排。你会命名任务吗?
  • 我的 cron 每 24 小时运行一次。我没有命名该任务,因为该任务是队列中唯一使用的任务。我确信它正在重试,因为它在应用引擎控制台上的任务队列概述中是这么说的。
  • 如果在任务队列确实正在重提任务的情况下问题仍然存在,那么在调度它们时命名任务意味着如果它已经在队列中并且未运行,您将收到一个 TaskAlreadyExistsError,如果它已经在运行,则会收到 TombstonedTaskError运行并被重新安排(即由于错误)。例如,您可以为任务指定一个唯一的名称(在 24 小时内)。
  • 重命名任务并不能解决问题。难道是我需要使用xml格式而不是java的yaml?这似乎不太可能,因为确实生成了队列(这意味着文件被正确解析,因为设置都匹配)

标签: java google-app-engine task-queue


【解决方案1】:

App Engine 中存在与重试限制设置为零相关的错误。该设置被忽略,任务被重试了几次。该问题已在 1.9.25 中修复。如果您在重试限制设置为 1 时看到此问题,您可能需要将其报告为新错误。

【讨论】:

  • 我试过设置为1,问题依旧。我看不到重试率是否在控制台中设置正确,但 yaml 文件几乎不可能不正确。
  • 尝试在任务本身上设置重试参数,而不是为队列设置。
  • 这已经解决了!奇怪的是,如果我不设置重试策略,它不会默认为队列的设置。
【解决方案2】:

任务队列将重试,直到达到限制、重试次数和期限。

docs 请解释一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2016-03-08
    • 2012-04-13
    • 2013-11-11
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多