使用 Java 8 版 Cron(基于 gcloud CLI)安排任务

借助 App Engine Cron 服务,您可以配置在指定时间或按固定时间间隔执行的定期计划任务。这些任务通常称为“Cron 作业”。Cron 作业由 App Engine Cron 服务自动触发。例如,您可以使用 Cron 作业每天发送一封电子邮件报告,或者每 10 分钟更新一次缓存数据,每小时刷新一次摘要信息。

Cron 作业会按计划对网址发出 HTTP GET 请求。调用网址的处理程序后,即执行相应逻辑。Cron 作业请求与推送任务队列请求受相同的限制约束。

准备工作

要部署或更新计划,您的帐号需要拥有以下某个 IAM 角色:

  • 所有者
  • Editor

您可以在 Google Cloud Console 中的 IAM 页面上设置权限。

创建 Cron 作业

  1. 在应用的根目录中创建 cron.yaml 文件(以及 app.yaml)。
  2. 在此文件中添加一个或多个 <cron> 条目,并定义作业的必要元素,包括必需的 <url><schedule> 元素。

    以下示例将创建一个每天执行的基本 Cron 作业:

    cron:
    - description: "daily summary job"
      url: /tasks/summary
      target: beta
      schedule: every 24 hours
    

    您可以视情况将目标 (target) 指定为服务/版本的名称。如果指定该元素,请将其添加到应用的主机名之前,以将作业路由到该服务/版本。如果未指定目标,则作业将在为流量配置的 default 服务版本中运行。

  3. 为 Cron 作业网址创建处理程序。处理程序应执行您想安排的任何任务,并使用 200 到 299(含)之间的 HTTP 状态代码进行响应,以表示其运行成功。或者,也可以返回其他状态代码,以用于重试 Cron 作业

处理程序可以像应用中的 Servlet 一样简单。web.xml 中的 Servlet 网址映射应与 Cron 作业网址相同。详细了解 cron.yaml 语法和选项

在开发服务器中测试 cron 作业

本地开发服务器不会自动运行 Cron 作业。您可以直接向 Cron 作业网址发出请求,以测试其功能。您可以使用本地 Cron 或计划任务界面,通过 curl 或类似工具触发作业的网址。

重试运行失败的 Cron 作业

如果 Cron 作业的请求处理程序返回的状态代码不在 200-299(含)范围内,则 App Engine 认为该作业失败。默认情况下,除非返回 503 状态代码,否则不会重试运行失败的作业。如返回 503 状态代码,则每分钟重试一次,直到运行成功或返回 200-299 状态代码。

要设置重新尝试执行失败的作业,请执行以下操作:

  1. cron.yaml 文件中添加 retry_parameters 块。
  2. retry_parameters 块中选择并设置重试参数

    例如,下面是一个 cron.yaml 文件示例,其中包含一个 Cron 作业,该作业配置为最多重试五次(默认值),起始退避时间为 2.5 秒,每次加倍。

    cron:
    - description: "retry demo"
      url: /retry
      schedule: every 10 mins
      retry_parameters:
        min_backoff_seconds: 2.5
        max_doublings: 5
    

详细了解 Cron 重试选项

部署 cron 作业

如需部署 cron.yaml 配置文件中指定的 Cron 作业,请运行以下命令:

gcloud

gcloud app deploy cron.yaml

Maven

mvn appengine:deployCron cron.yaml

Gradle

gradle appengineDeployCron cron.yaml

IDE

如果您使用的是 IntelliJEclipse,则可以使用部署表单来选择要部署的各个配置文件。

删除所有 Cron 作业

要删除所有 cron 作业:

  1. cron.yaml 文件的内容修改为:

    cron:
    
  2. cron.yaml 文件部署到 App Engine。

保护 Cron 的网址

Cron 处理程序只是 app.yaml 中定义的一个普通处理程序。您可以将访问权限仅局限于管理员帐号,这样就可以防止用户访问计划任务使用的网址。计划任务可以访问仅限管理员访问的网址。您可以通过将 login: admin 添加到 app.yaml 中的处理程序配置来限制网址。

app.yaml 中的一个示例可能如下所示:

application: hello-cron
version: 1
runtime: java
api_version: 1

handlers:
- url: /report/weekly
  servlet: mysite.server.CronServlet
  login: admin

要测试 Cron 作业,请以管理员身份登录,然后在浏览器中访问处理程序的网址。

来自 Cron 服务的请求还包含下面的 HTTP 标头:

X-Appengine-Cron: true

X-Appengine-Cron 标头由 App Engine 在内部设置。如果您的请求处理程序找到此标头,则可以确信该请求是 Cron 请求。如果该标头出现在应用的外部用户请求中,将该标头会被删除(由允许设置测试标头的应用管理员登录并发出的请求除外)。

App Engine 从 IP 地址 0.1.0.2 发出 Cron 请求。对于使用旧版 gcloud(版本低于 326.0.0)创建的 Cron 作业,Cron 请求将来自 0.1.0.1

调用 Google Cloud Endpoints

您无法在 Cron 作业的 url 字段中指定 Google Cloud Endpoints 端点。如果您希望 Cron 作业调用 Google Cloud Endpoints 端点,请向应用中的处理程序处理的目标发出请求,并通过处理程序代码调用端点类和方法。

在控制台中查看 Cron 作业

您可以在 Cloud SchedulerApp Engine Cron 作业标签页中查看计划的 Cron 作业。

您可以查看日志,以了解添加或删除 Cron 作业的时间。

了解详情

如需详细了解如何定义 Cron 作业,请参阅 cron.yaml 参考文档