借助 App Engine Cron 服务,您可以配置在指定时间或按固定时间间隔执行的定期计划任务。这些任务通常称为“Cron 作业”。这些 Cron 作业由 App Engine Cron 服务自动触发。例如,您可以使用 Cron 作业每天发送一封电子邮件报告,每 10 分钟更新部分缓存数据,或者每小时刷新一次摘要信息。
Cron 作业会按计划向配置 Cron 作业的应用中的指定端点发出 HTTP GET
请求。该端点的处理程序被调用后,即执行相应逻辑。
App Engine Cron 服务不能用于在 App Engine 主机应用之外调用 Web 端点。它不能用于从主机应用之外的其他应用调用 App Engine 端点。
Cron 作业请求与推送任务队列请求受相同的限制约束。
准备工作
要部署或更新计划,您的账号需要拥有以下某个 IAM 角色:
- Owner
- Editor
您可以在 Google Cloud 控制台中的 IAM 页面上设置权限。
创建 Cron 作业
- 在应用的根目录中创建
cron.yaml
文件(以及app.yaml
)。 在此文件中添加一个或多个
<cron>
条目,并定义作业的必要元素,包括必需的<url>
和<schedule>
元素。 如需详细了解cron.yaml
文件的元素,请查看 cron.yaml 语法和选项。以下示例将创建一个每天执行的基本 Cron 作业。
cron: - description: "daily summary job" url: /tasks/summary target: beta schedule: every 24 hours
您可以视情况将目标 (target) 指定为服务/版本的名称。如果指定该元素,请将其添加到应用的主机名之前,以将作业路由到该服务/版本。如果未指定目标,则作业将在为流量配置的
default
服务版本中运行。为 Cron 作业网址创建处理程序。处理程序应执行您想安排的任何任务,并使用 200 到 299(含)之间的 HTTP 状态代码进行响应,以表示其运行成功。或者,也可以返回其他状态代码,以用于重试 Cron 作业。
web.xml
中的 Servlet 网址映射应与 Cron 作业网址相同。
在开发服务器中测试 Cron 作业
本地开发服务器不会自动运行 Cron 作业。您可以直接向 Cron 作业网址发出请求,以测试其功能。您可以使用本地 Cron 或计划任务界面,通过 curl 或类似工具触发作业的网址。
重试运行失败的 Cron 作业
如果 Cron 作业的请求处理程序返回的状态代码不在 200-299(含)范围内,则 App Engine 认为该作业失败。默认情况下,除非返回 503 状态代码,否则不会重试运行失败的作业。如返回 503 状态代码,则每分钟重试一次,直到运行成功或返回 200-299 状态代码。
要设置重新尝试执行失败的作业,请执行以下操作:
- 在
cron.yaml
文件中添加retry_parameters
块。 在
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.yaml
配置文件中指定的 Cron 作业,请运行以下命令:
gcloud
gcloud app deploy cron.yaml
Maven
mvn appengine:deployCron cron.yaml
Gradle
gradle appengineDeployCron cron.yaml
IDE
删除所有 Cron 作业
要删除所有 cron 作业:
将
cron.yaml
文件的内容修改为:cron:
将
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 端点,请向应用中的处理程序处理的目标发出请求,并通过处理程序代码调用端点类和方法。
在 Google Cloud 控制台中查看 Cron 作业
您可以在 Cloud Scheduler 的 App Engine Cron 作业标签页中查看计划的 Cron 作业。
您可以查看日志,以了解添加或删除 Cron 作业的时间。
了解详情
如需详细了解如何定义 Cron 作业,请参阅 cron.yaml 参考文档。