IBM Cloud Docs
使用定期计时器 (cron) 事件生产者

使用定期计时器 (cron) 事件生产者

定期计时器 (cron) 事件生产者定期生成事件。 此时间间隔可以按分钟,小时,天或月或多个不同时间间隔的组合进行调度。 您可以预订 Code Engine 应用程序,函数和作业以接收 cron 事件。

定期计时器事件预订使用标准 crontab 语法来指定时间间隔详细信息,格式为 * * * * *,其中字段为分钟,小时,月的日期,年的月份和周的日期。 例如,要将事件调度为午夜,请指定 0 0 * * *。 要调度每个星期五午夜的事件,请指定 0 0 * * 5。 有关 crontab 的更多信息,请参阅 CRONTAB

预订定期计时器事件生产者时,必须提供目标 (应用程序,功能或作业) 以及预订的目标类型。 如果未提供调度,那么将使用缺省值 * * * * * (每分钟)。

Code Engine 具有项目和预订限制内的定期计时器预订配额。 有关 Code Engine 限制的更多信息,请参阅 Code Engine

预订应用程序的定期计时器 (cron) 事件

您可以从控制台或 CLI 处理定期计时器预订。

事件将作为 HTTP POST 请求发送到应用程序。 有关事件随附的信息的更多信息,请参阅 事件的 HTTP 头和主体信息

从控制台预订应用程序的定期计时器 (cron) 事件

您可以从控制台为应用程序创建和更新定期计时器事件预订。

准备工作

完成以下步骤以从控制台创建和更新应用程序的定期计时器事件预订。

  1. Code Engine "项目" 页面,转至您的项目。

  2. 在“概述”页面中,单击 事件预订

  3. 在“事件预订”页面中,单击 创建 以创建预订。

  4. 在创建事件订阅页面,完成以下步骤:

    1. 对于 事件类型,选择“定期计时器”磁贴。 单击下一步
    2. 对于 常规,请提供定期计时器预订的名称,例如 myptimer。 您可以选择提供事件属性。 请注意,如果定期计时器事件使用者是应用程序,那么事件属性可用作 HTTP 头。 如果事件消费者是作业,则事件属性可作为环境变量使用。 单击“下一步”继续。
    3. 对于 调度,请提供有关事件计时的信息。 定期计时器事件生产者使用标准 crontab 语法来指定时间间隔详细信息。 从提供的模式中选择您的时间间隔,或者提供您自己的定制 cron 表达式 (例如 0 0 * * *),该表达式指定每天午夜发生事件。 对于此示例,请选择每天,每小时和每分钟的调度模式。 请注意,将为您生成 cron 表达式。 天,小时和分钟模式以及 Cron 表达式 采用全球标准时间 (UTC)。 如果未指定调度,那么此事件预订每分钟发送一个事件。 此时将显示即将到来的预定事件的列表。 请注意,这些即将到来的预定事件将显示在您的时区中。 单击“下一步”继续。
    4. 对于 定制事件数据,请提供要包含在事件消息主体中的数据。 可以将消息指定为纯文本或 Base64 格式。 对于此示例,指定文本 hello stranger 作为事件消息的主体。 如果消息为 Base64 格式,那么可以选择在发送事件时对消息进行解码。 您还可以指定定制事件数据的内容类型。 单击“下一步”继续。
    5. 对于 事件使用者,指定要接收事件的应用程序或作业。 请注意,您可以从已定义的应用程序和作业的列表中进行选择。 对于此示例,请使用引用 icr.io/codeengine/cron 映像的 myapp 应用程序。 如果尚未创建应用程序或作业,那么可以指定应用程序或作业的名称,并在创建定期计时器预订后 创建应用程序创建作业。 (仅限应用程序) 您可以选择指定路径。 缺省情况下,事件将路由到目标应用程序的根 URL。 您可以通过指定路径将事件发送到应用程序中的其他目标。 例如,如果预订路径指定 /events,那么会将事件发送到 https://<base application URL>/events。 单击“下一步”继续。
    6. 对于 摘要,请查看定期计时器事件预订的设置,并根据需要进行更改。 就绪后,单击 创建 以创建定期计时器预订。
  5. 创建了定期计时器订阅后,请转到事件订阅页面 查看已定义订阅的列表

  6. 要更新预订,请浏览至定期计时器预订页面。 在“事件预订”页面中,单击要更新的预订的名称。

  7. 从定期计时器预订页面,更改事件消息中的数据。 从 定制事件数据 选项卡,将事件数据更改为 hello sunshine。 单击保存以保存更改。

  8. 由于 myapp 应用程序引用样本 cron 应用程序 (将信息打印到日志文件),因此您可以查看日志。 查看 myapp 事件使用者应用程序的应用程序日志,并查看事件消息为 hello sunshine。 请参阅 从控制台查看应用程序日志

使用 CLI 预订应用程序的定期计时器 (cron) 事件

准备工作

ibmcloud ce application create --name myapp --image icr.io/codeengine/cron

要使用 CLI 将应用程序连接到定期计时器预订,请使用 ibmcloud ce sub cron create 命令。

ibmcloud ce sub cron create --name NAME --destination-type APP --destination APPLICATION_NAME --schedule CRON

例如,要创建用于在每天午夜向名为 myapp 的应用程序发送事件的 Cron 预订,请执行以下操作:

ibmcloud ce sub cron create --name mycronevent --destination-type app --destination myapp --schedule '0 0 * * *'

必须将调度值括在引号中,以确保将其视为单个字符串。

下表汇总了上一个示例中与 sub cron create 命令一起使用的选项。 有关该命令及其选项的更多信息,请参阅 ibmcloud ce subscription cron create 命令。

命令选项
选项 描述
--name cron 事件源的名称。 此值是必需的。
--destination 当前项目中用于从事件生产者接收事件的 Code Engine 应用程序或作业的名称。 此值是必需的。
--destination-type destination 的类型,在本例中为 app。 缺省值为 app
--schedule 以 crontab 格式调度触发事件的频率。 例如,为每 2 分钟指定 */2 * * * * (字符串格式)。 缺省情况下,cron 事件每分钟触发一次,并设置为 UTC 时区。 要修改时区,请使用 --time-zone 选项。 此值是可选的。
有关使用 sub cron 命令的提示
  • 缺省情况下,事件将路由到目标应用程序的根 URL。 您可以使用 --path 选项将事件发送到应用程序中的其他目标。 例如,如果预订指定 --path /events,那么会将事件发送到 https://<base application URL>/events
  • 定期计时器事件的数据大小限制为最大 4096 字节。 因此,如果使用 --data 选项或 --data-base64 选项,那么最多可以发送 4096 字节。 有关更多信息,请参阅 Code Engine
  • 缺省情况下,cron 预订使用 UTC 时区。 您可以通过对 sub cron createsub cron update 命令指定 --time-zone 选项来更改时区。 有关有效时区值,请参阅 TZ 数据库。 请注意,如果使用 kubectl 创建预订并且未指定时区,那么将分配 UTC 时区。
  • 如果尚未创建应用程序或作业事件使用者,请将 --force 选项与 sub cron create 命令配合使用,以强制创建 cron 事件预订。 您可以指定应用程序或作业的名称,并在创建 cron 预订后 创建应用程序创建作业

要验证是否已成功创建 cron 预订,请运行 ibmcloud ce sub cron get --name mycronevent 命令。

示例输出

Getting cron source 'mycronevent'...
OK

Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           2m21s
Created:       2021-03-14T13:37:51-05:00

Destination Type:  app
Destination:       myapp
Schedule:          0 0 * * *
Time Zone:         UTC
Ready:             true

Events:
    Type     Reason            Age        Source                 Messages
    Normal   FinalizerUpdate   12s        pingsource-controller  Updated "mycronevent" finalizers

在此输出中,您可以看到目标应用程序为 myapp,调度为 0 0 * * * (每天午夜),“就绪”状态为 true

使用 CLI 更新 cron 预订

要使用 CLI 更新 cron 预订,请使用 ibmcloud ce subscription cron update 命令。 例如,更新 mycronevent 预订以更改调度,从而每 2 分钟向名为 myapp 的应用程序发送一次事件。

ibmcloud ce sub cron update --name mycronevent --schedule '*/2 * * * *'

要验证 cron 预订是否已成功更新,请运行 ibmcloud ce sub cron get --name mycronevent 命令。 已更新预订的调度。

示例输出

Getting cron source 'mycronevent'...
OK

Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           2m21s
Created:       2021-08-31T16:00:49-04:00

Destination Type:  app
Destination:       myapp
Schedule:          */2 * * * *
Time Zone:         UTC
Ready:             true

Events:
  Type    Reason                       Age               Source                 Messages
  Normal  PingSourceSynchronized       7s (x3 over 13m)  pingsource-controller  PingSource adapter is synchronized

要尝试教程吗? 请参阅 预订定期计时器(cron)事件。 要查找更多代码示例吗? 请查看 IBM Cloud Code Engine GitHub 存储库的样本

从控制台查看应用程序的事件信息

要查看有关事件预订的信息,

  1. Code Engine "项目" 页面,转至您的项目。
  2. 从“概述”页面,单击 事件预订 以查看已定义的预订的列表。

如果应用程序像样本 cron 应用程序一样将信息打印到日志文件,请查看事件使用者应用程序的日志文件。 请参阅 从控制台查看应用程序日志

使用 CLI 查看应用程序的事件信息

如果应用程序像样本 cron 应用程序一样将信息打印到日志文件,请使用 ibmcloud ce app logs CLI 命令查看事件使用者应用程序的日志文件。 例如,要查看您在上一个示例中创建的应用程序的日志,

ibmcloud ce application logs --application myapp

示例输出

Getting logs for all instances of application 'myapp'...
OK

myapp-mw25y-1-deployment-8579d868f4-ssfnr/user-container:
Listening on port 8080
2021-04-13 17:22:08 - Received:
URL: /
Header: Accept-Encoding=[gzip]
Header: Ce-Id=[d2faa29c-8088-410f-bb30-416085c52a0b]
Header: Ce-Source=[/apis/v1/namespaces/81fvkfqi3n6/pingsources/mycronevent]
Header: Ce-Specversion=[1.0]
Header: Ce-Time=[2021-04-13T17:22:00.059682656Z]
Header: Ce-Type=[dev.knative.sources.ping]
Header: Content-Length=[0]
Header: Forwarded=[for=172.30.136.209;proto=http, for=172.30.48.203]
Header: K-Proxy-Request=[activator]
Header: Traceparent=[00-b13196fe439b6d7d67f3205b2f655788-e9fee441cd41158c-00]
Header: User-Agent=[Go-http-client/1.1]
Header: X-B3-Sampled=[0]
Header: X-B3-Spanid=[1dd2d76079811204]
Header: X-B3-Traceid=[710b7c383682d0cd1dd2d76079811204]
Header: X-Envoy-Attempt-Count=[1]
Header: X-Envoy-Decorator-Operation=[myapp-mw25y-1.81fvkfqi3n6.svc.cluster.local:80/*]
Header: X-Envoy-Internal=[true]
Header: X-Envoy-Peer-Metadata=[ChQKDkFQUF9DT05UQUlORVJTEgIaAAoaCgpDTFVTVEVSX0lEEgwaCkt1YmVybmV0ZXMKGAoNSVNUSU9fVkVSU0lPThIHGgUxLjkuMQq+AwoGTEFCRUxTErMDKrADCh0KA2FwcBIWGhRpc3Rpby1pbmdyZXNzZ2F0ZXdheQoTCgVjaGFydBIKGghnYXRld2F5cwoUCghoZXJpdGFnZRIIGgZUaWxsZXIKNgopaW5zdGFsbC5vcGVyYXRvci5pc3Rpby5pby9vd25pbmctcmVzb3VyY2USCRoHdW5rbm93bgoZCgVpc3RpbxIQGg5pbmdyZXNzZ2F0ZXdheQoZCgxpc3Rpby5pby9yZXYSCRoHZGVmYXVsdAowChtvcGVyYXRvci5pc3Rpby5pby9jb21wb25lbnQSERoPSW5ncmVzc0dhdGV3YXlzCiAKEXBvZC10ZW1wbGF0ZS1oYXNoEgsaCTU1YjU0N2Y0ZgoSCgdyZWxlYXNlEgcaBWlzdGlvCjkKH3NlcnZpY2UuaXN0aW8uaW8vY2Fub25pY2FsLW5hbWUSFhoUaXN0aW8taW5ncmVzc2dhdGV3YXkKLwojc2VydmljZS5pc3Rpby5pby9jYW5vbmljYWwtcmV2aXNpb24SCBoGbGF0ZXN0CiIKF3NpZGVjYXIuaXN0aW8uaW8vaW5qZWN0EgcaBWZhbHNlChoKB01FU0hfSUQSDxoNY2x1c3Rlci5sb2NhbAouCgROQU1FEiYaJGlzdGlvLWluZ3Jlc3NnYXRld2F5LTU1YjU0N2Y0Zi10aHN4cAobCglOQU1FU1BBQ0USDhoMaXN0aW8tc3lzdGVtCl0KBU9XTkVSElQaUmt1YmVybmV0ZXM6Ly9hcGlzL2FwcHMvdjEvbmFtZXNwYWNlcy9pc3Rpby1zeXN0ZW0vZGVwbG95bWVudHMvaXN0aW8taW5ncmVzc2dhdGV3YXkKFwoRUExBVEZPUk1fTUVUQURBVEESAioACicKDVdPUktMT0FEX05BTUUSFhoUaXN0aW8taW5ncmVzc2dhdGV3YXk=]
Header: X-Envoy-Peer-Metadata-Id=[router~172.30.48.203~istio-ingressgateway-55b547f4f-thsxp.istio-system~istio-system.svc.cluster.local]
Header: X-Forwarded-For=[172.30.136.209, 172.30.48.203, 172.30.167.171]
Header: X-Forwarded-Proto=[http]
Header: X-Request-Id=[fe8d6cec-f0e4-47c2-b9ae-81764cb377bc]

有关日志记录的更多信息,请参阅 查看日志

要查找更多代码示例吗? 请查看 IBM Cloud Code Engine GitHub 存储库的样本

传递到应用程序的事件的 cron 头和主体信息

传递到应用程序的所有事件都将作为 HTTP POST 消息接收。 事件包含某些 HTTP 头,可帮助您快速确定有关事件的信息的关键位,而无需查看事件的主体 (业务逻辑)。 有关更多信息,请参阅 CloudEvents 规范

下表描述了定期计时器 (cron) 事件的头:

事件标题字段
描述
ce-id 事件的唯一标识,除非事件已重放,在这种情况下,将为其分配相同的标识。
ce-source 用于指示此事件在事件生产者中的起源位置的 URI 引用。 对于 cron 事件,此头是具有项目子域的 URI 引用以及 cron 预订的名称,格式如下: /apis/v1/namespaces/[PROJECT_SUBDOMAIN]/pingsources/[SUBSCRIPTION_NAME]
ce-specversion CloudEvents 规范的版本。 该值始终为 "1.0
ce-time 事件发生的时间。
ce-type 事件类型。 对于 cron 事件,这是 dev.knative.sources.ping

示例输出

ce-id: c329ed76-5004-4383-a3cc-c7a9b82e3ac6
ce-source: /apis/v1/namespaces/6b0v3x9xek5/pingsources/mycronevent
ce-specversion: 1.0
ce-time: 2021-02-26T19:19:00.497637287Z
ce-type: dev.knative.sources.ping

HTTP 主体

HTTP 主体包含事件本身,并且采用您在创建或更新预订时指定的格式。

预订函数的定期计时器 (cron) 事件

您可以从控制台或 CLI 处理定期计时器预订。

将事件作为 HTTP POST 请求发送到函数。 有关事件随附的信息的更多信息,请参阅 事件的 HTTP 头和主体信息

从控制台预订功能的定期计时器 (cron) 事件

您可以从控制台为功能创建和更新定期计时器事件预订。

准备工作

/**
 * The `main` function is the entry-point into the function.
 * It has one optional argument 'params', which carries all the
 * parameters the function was invoked with.
*/
async function main(params) {

  // add process environment variables
  params.env = process.env

  // print recognizable string to the log
  console.log('Function invocation via cron subscription');

  // log params object, so invocation can be observed in the logs
  console.dir(params);

  // craft a simple HTTP RC 200 response,
  // which also echos the params object
  response = {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    },
    body: params
  };
  return response
}

完成以下步骤以从控制台为功能创建和更新定期计时器事件预订。

  1. Code Engine "项目" 页面,转至您的项目。

  2. 在“概述”页面中,单击 事件预订

  3. 在“事件预订”页面中,单击 创建 以创建预订。

  4. 在创建事件订阅页面,完成以下步骤:

    1. 对于 事件类型,选择“定期计时器”磁贴。 单击下一步
    2. 对于 常规,请提供定期计时器预订的名称,例如 myptimer。 您可以选择提供事件属性。 请注意,如果定期计时器事件使用者是应用程序,那么事件属性可用作 HTTP 头。 如果事件使用者是函数,那么事件属性将作为 params 对象的 __ce_headers 属性中的键/值对提供。 单击“下一步”继续。
    3. 对于 调度,请提供有关事件计时的信息。 定期计时器事件生产者使用标准 crontab 语法来指定时间间隔详细信息。 从提供的模式中选择您的时间间隔,或者提供您自己的定制 cron 表达式 (例如 0 0 * * *),该表达式指定每天午夜发生事件。 对于此示例,请选择每天,每小时和每分钟的调度模式。 请注意,将为您生成 cron 表达式。 天,小时和分钟模式以及 Cron 表达式 采用全球标准时间 (UTC)。 如果未指定调度,那么此事件预订每分钟发送一个事件。 此时将显示即将到来的预定事件的列表。 请注意,这些即将到来的预定事件将显示在您的时区中。 单击“下一步”继续。
    4. 对于 定制事件数据,请提供要包含在事件消息主体中的数据。 可以将消息指定为纯文本或 Base64 格式。 对于此示例,指定文本 hello stranger 作为事件消息的主体。 如果消息为 Base64 格式,那么可以选择在发送事件时对消息进行解码。 您还可以指定定制事件数据的内容类型。 单击“下一步”继续。
    5. 对于 事件使用者,选择组件类型 Function 并指定用于接收事件的函数。 请注意,您可以从定义的函数列表中进行选择。 对于此示例,请使用使用样本内联代码的 myfun 函数。 如果尚未创建函数,那么可以在创建定期计时器预订后指定函数名称和 使用内联代码创建函数工作负载。 单击“下一步”继续。
    6. 对于 摘要,请查看定期计时器事件预订的设置,并根据需要进行更改。 就绪后,单击 创建 以创建定期计时器预订。
  5. 创建了定期计时器订阅后,请转到事件订阅页面 查看已定义订阅的列表

  6. 要更新预订,请浏览至定期计时器预订页面。 在“事件预订”页面中,单击要更新的预订的名称。

  7. 从定期计时器预订页面,更改事件消息中的数据。 从 定制事件数据 选项卡中,将事件数据更改为 { "hello": "world" },并选择 application/json 作为 定制事件数据的内容类型。 单击保存以保存更改。

  8. 因为 myfun 函数使用样本内联代码 (将完整 params 对象打印到日志文件),所以您可以查看日志以验证是否已调用该函数。 查看 myfun 事件使用者函数的函数日志,并查看 params 对象包含键/值对 hello: world。 您还可以看到 params 对象的 body 字段包含 Base64 编码值 { "hello": "world" } 请参阅 从控制台查看函数日志

使用 CLI 预订函数的定期计时器 (cron) 事件

准备工作

/**
 * The `main` function is the entry-point into the function.
 * It has one optional argument 'params', which carries all the
 * parameters the function was invoked with.
*/
async function main(params) {

  // add process environment variables
  params.env = process.env

  // print recognizable string to the log
  console.log('Function invocation via cron subscription');

  // log params object, so invocation can be observed in the logs
  console.dir(params);

  // craft a simple HTTP RC 200 response,
  // which also echos the params object
  response = {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    },
    body: params
  };
  return response
}

将代码保存到名为 sample_inline_code.js 的文件中,并使用以下命令创建函数:

ibmcloud ce function create --name myfun --runtime nodejs --inline-code ./sample_inline_code.js

要使用 CLI 将您的功能连接到定期计时器预订,请使用 ibmcloud ce sub cron create 命令:

ibmcloud ce sub cron create --name NAME --destination-type function --destination FUNCTION_NAME --schedule CRON

例如,要创建用于在每天午夜向名为 myfun 的应用程序发送事件的 Cron 预订,请执行以下操作:

ibmcloud ce sub cron create --name mycronevent --destination-type function --destination myfun --schedule '0 0 * * *'

必须将调度值括在引号中,以确保将其视为单个字符串。

下表汇总了上一个示例中与 sub cron create 命令一起使用的选项。 有关该命令及其选项的更多信息,请参阅 ibmcloud ce subscription cron create 命令。

命令选项
选项 描述
--name cron 事件源的名称。 此值是必需的。
--destination 当前项目中用于从事件生产者接收事件的 Code Engine 应用程序,函数或作业的名称。 此值是必需的。
--destination-type destination 的类型,在本例中为 function。 缺省值为 app
--schedule 以 crontab 格式调度触发事件的频率。 例如,为每 2 分钟指定 */2 * * * * (字符串格式)。 缺省情况下,cron 事件每分钟触发一次,并设置为 UTC 时区。 要修改时区,请使用 --time-zone 选项。 此值是可选的。
有关使用 sub cron 命令的提示
  • 定期计时器事件的数据大小限制为最大 4096 字节。 因此,如果使用 --data 选项或 --data-base64 选项,那么最多可以发送 4096 字节。 有关更多信息,请参阅 Code Engine
  • 缺省情况下,cron 预订使用 UTC 时区。 您可以通过对 sub cron createsub cron update 命令指定 --time-zone 选项来更改时区。 有关有效时区值,请参阅 TZ 数据库。 请注意,如果使用 kubectl 创建预订并且未指定时区,那么将分配 UTC 时区。
  • 如果尚未创建应用程序或作业事件使用者,请将 --force 选项与 sub cron create 命令配合使用,以强制创建 cron 事件预订。 您可以在创建 cron 预订后指定函数 创建函数 的名称。

要验证是否已成功创建 cron 预订,请运行 ibmcloud ce sub cron get --name mycronevent 命令。

示例输出

Getting cron event subscription 'mycronevent'...
OK

Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           2m21s
Created:       2024-03-14T13:37:51-05:00

Destination Type:  function
Destination:       myfun
Schedule:          0 0 * * *
Time Zone:         UTC
Ready:             true

Events:
  Type    Reason                  Age                Source                 Messages
  Normal  FinalizerUpdate         20s                pingsource-controller  Updated "mycronevent" finalizers
  Normal  PingSourceSynchronized  20s                pingsource-controller  PingSource adapter is synchronized

在此输出中,您可以看到目标函数为 myfun,调度为 0 0 * * * (每天午夜),并且“就绪”状态为 true

使用 CLI 更新 cron 预订

要使用 CLI 更新 cron 预订,请使用 ibmcloud ce subscription cron update 命令。 例如,更新 mycronevent 预订以更改调度,从而每隔 2 分钟将事件发送到名为 myfun 的函数:

ibmcloud ce sub cron update --name mycronevent --schedule '*/2 * * * *'

要验证 cron 预订是否已成功更新,请运行 ibmcloud ce sub cron get --name mycronevent 命令。 已更新预订的调度。

示例输出

Getting cron event subscription 'mycronevent'...
OK

Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           37m41s
Created:       2024-03-14T14:04:51-05:00

Destination Type:  function
Destination:       myfun
Schedule:          */2 * * * *
Time Zone:         UTC
Ready:             true

Events:
  Type    Reason                  Age                Source                 Messages
  Normal  FinalizerUpdate         20s                pingsource-controller  Updated "mycronevent" finalizers
  Normal  PingSourceSynchronized  20s                pingsource-controller  PingSource adapter is synchronized

要尝试教程吗? 请参阅 预订定期计时器(cron)事件。 要查找更多代码示例吗? 请查看 IBM Cloud Code Engine GitHub 存储库的样本

从控制台查看函数的事件信息

查看活动订阅信息:

  1. Code Engine "项目" 页面,转至您的项目。
  2. 从“概述”页面,单击 事件预订 以查看已定义的预订的列表。

如果您的函数会将信息打印到日志文件(如示例 "codeengine 作业),那么请查看函数的日志文件。 请参阅 从控制台查看作业日志

传递到函数的事件的 cron 头和主体信息

传递到函数的所有事件都将作为 HTTP POST 消息接收。 事件包含某些 HTTP 头,这些头可帮助您快速确定有关事件的信息的关键位。 HTTP 头存储在用于调用函数的 params 对象的 __ce_headers 属性中。 有关更多信息,请参阅 CloudEvents 规范

下表描述了 __ce_headers 中针对定期计时器 (cron) 事件的键/值对:

事件头文件
描述
Ce-Id 事件的唯一标识,除非事件已重放,在这种情况下,将为其分配相同的标识。
Ce-Source 用于指示此事件在事件生产者中的起源位置的 URI 引用。 对于 cron 事件,此头是具有项目子域的 URI 引用以及 cron 预订的名称,格式如下: /apis/v1/namespaces/[PROJECT_SUBDOMAIN]/pingsources/[SUBSCRIPTION_NAME]
Ce-Specversion CloudEvents 规范的版本。 该值始终为 "1.0
Ce-Time 事件发生的时间。
Ce-Type 事件类型。 对于 cron 事件,这是 dev.knative.sources.ping

示例输出

  __ce_headers: {
     "Ce-Id": "b861440f-0e17-44ab-9bab-826da0c9713f",
     "Ce-Source": "/apis/v1/namespaces/7iuw2furi55/pingsources/mycronevent",
     "Ce-Specversion": "1.0",
     "Ce-Time": "2024-06-02T10:56:00.062572905Z",
     "Ce-Type": "dev.knative.sources.ping"
  }

HTTP 主体

HTTP 主体包含定制事件数据,并且采用您在创建或更新预订时指定的格式。 您可以从 params 对象中的 body 属性访问定制事件数据。

用于将定制事件数据设置为 hello stranger 并将 定制事件数据的内容类型 设置为 text/plain 的事件调用的示例 params 对象:

  {
    "__ce_headers": {
        "Ce-Id": "b861440f-0e17-44ab-9bab-826da0c9713f",
        "Ce-Source": "/apis/v1/namespaces/7iuw2furi55/pingsources/mycronevent",
        "Ce-Specversion": "1.0",
        "Ce-Time": "2024-06-02T10:56:00.062572905Z",
        "Ce-Type": "dev.knative.sources.ping",
        "Content-Length": "14",
        "Content-Type": "text/plain"
    },
    "body": "hello stranger"
  }

如果 定制事件数据的内容类型 设置为 application/json,那么 body 的值为 Base64 编码。

预订作业的定期计时器 (cron) 事件

您可以从控制台或 CLI 处理定期计时器预订。

您的作业将事件作为环境变量接收。 有关 cron 发送的环境变量的更多信息,请参阅 事件的环境变量

从控制台预订作业的定期计时器 (cron) 事件

您可以从控制台创建和更新作业的定期计时器事件预订。

准备工作

完成以下步骤以从控制台创建和更新作业的定期计时器事件预订。

  1. Code Engine "项目" 页面,转至您的项目。

  2. 在“概述”页面中,单击 事件预订

  3. 在“事件预订”页面中,单击 创建 以创建预订。

  4. 在创建事件订阅页面,完成以下步骤:

    1. 对于 常规,请提供定期计时器预订的名称,例如 myptimer2。 您可以选择提供事件属性。 请注意,如果定期计时器事件使用者是应用程序,那么事件属性可用作 HTTP 头。 如果事件消费者是作业,则事件属性可作为环境变量使用。 单击“下一步”继续。
    2. 对于 调度,请提供有关事件计时的信息。 定期计时器事件生产者使用标准 crontab 语法来指定时间间隔详细信息。 从提供的模式中选择您的时间间隔,或者提供您自己的定制 cron 表达式 (例如 0 0 * * *),该表达式指定每天午夜发生事件。 对于此示例,请选择每天,每小时和每分钟的调度模式。 请注意,将为您生成 cron 表达式。 天,小时和分钟模式以及 Cron 表达式 采用全球标准时间 (UTC)。 如果未指定调度,那么此事件预订每分钟发送一个事件。 此时将显示即将到来的预定事件的列表。 请注意,这些即将到来的预定事件将显示在您的时区中。 单击“下一步”继续。
    3. 对于 定制事件数据,请提供要包含在事件消息主体中的数据。 可以将消息指定为纯文本或 Base64 格式。 对于此示例,指定文本 hello stranger 作为事件消息的主体。 如果消息为 Base64 格式,那么可以选择在发送事件时对消息进行解码。 您还可以指定定制事件数据的内容类型。 单击“下一步”继续。
    4. 对于 事件使用者,指定要接收事件的应用程序或作业。 请注意,您可以从已定义的应用程序和作业的列表中进行选择。 对于此示例,请使用引用 icr.io/codeengine/codeengine 映像的 myjob 作业。 如果尚未创建作业,那么可以在创建定期计时器预订后指定作业的名称并 创建作业。 单击“下一步”继续。
    5. 对于 摘要,请查看定期计时器事件预订的设置,并根据需要进行更改。 就绪后,单击 创建 以创建定期计时器预订。
  5. 创建了定期计时器订阅后,请转到事件订阅页面 查看已定义订阅的列表

  6. 要更新预订,请浏览至定期计时器预订页面。 在“事件预订”页面中,单击要更新的预订的名称。

  7. 从定期计时器预订页面,更改事件消息中的数据。 从 定制事件数据 选项卡,将事件数据更改为 hello sunshine。 单击保存以保存更改。

  8. 由于 myjob 作业引用样本 codeengine 应用程序 (将信息打印到日志文件),因此您可以查看日志。 查看 myjob 事件使用者作业的作业日志,并查看事件消息为 hello sunshine。 请参阅 从控制台查看作业日志

使用 CLI 预订作业的定期计时器 (cron) 事件

准备工作

ibmcloud ce job create --name myjob --image icr.io/codeengine/codeengine

使用 ibmcloud ce sub cron create 命令通过 CLI 将作业连接到定期计时器预订。

ibmcloud ce sub cron create --name NAME --destination-type job --destination JOB_NAME --schedule CRON

例如,要创建用于将事件发送到名为 myjob 的作业 (每 5 分钟) 的 cron 预订,

ibmcloud ce sub cron create --name mycronevent --destination-type job --destination myjob --schedule '*/5 * * * *' --data '{ "message": "Hello world!" }' --content-type application/json

必须将调度值括在引号中,以确保将其视为单个字符串。

下表概述了此示例中与 sub cron create 命令配合使用的选项。 有关该命令及其选项的更多信息,请参阅 ibmcloud ce subscription cron create 命令。

命令选项
选项 描述
--name cron 事件源的名称。
--destination-type destination 的类型,在本例中为 job
--destination 当前项目中用于从事件生产者接收事件的 Code Engine 作业的名称。
--schedule 以 crontab 格式调度触发事件的频率。 例如,为每 2 分钟指定 */2 * * * * (字符串格式)。 缺省情况下,cron 事件每分钟触发一次,并设置为 UTC 时区。 要修改时区,请使用 --time-zone 选项。 此值是可选的。
有关使用 sub cron 命令的提示
  • 定期计时器事件的数据大小限制为最大 4096 字节。 因此,如果使用 --data 选项或 --data-base64 选项,那么最多可以发送 4096 字节。 有关更多信息,请参阅 Code Engine
  • 缺省情况下,cron 预订使用 UTC 时区。 您可以通过对 sub cron createsub cron update 命令指定 --time-zone 选项来更改时区。 有关有效时区值,请参阅 TZ 数据库。 请注意,如果使用 kubectl 创建预订并且未指定时区,那么将分配 UTC 时区。
  • 如果尚未创建应用程序或作业事件使用者,请将 --force 选项与 sub cron create 命令配合使用,以强制创建 cron 事件预订。 您可以指定应用程序或作业的名称,并在创建 cron 预订后 创建应用程序创建作业

要验证是否已成功创建 cron 预订,请运行 ibmcloud ce sub cron get --name mycronevent

示例输出

Getting cron source 'mycronevent'...
OK

Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           54s
Created:       2021-04-13T11:38:50-05:00

Destination Type:  job
Destination:       myjob
Schedule:          */5 * * * *
Time Zone:         UTC
Content Type:      application/json
Data:              { "message": "Hello world!" }
Ready:             true

Events:
    Type     Reason            Age        Source                 Messages
    Normal   FinalizerUpdate   12s        pingsource-controller  Updated "mycronevent" finalizers

从此输出中,您可以看到目标作业为 myjob,调度为 */5 * * * * (每 5 分钟),就绪状态为 true

预订创建的作业运行将在 10 分钟后删除。

使用 CLI 更新 cron 预订 (作业)

要使用 CLI 更新 cron 预订,请使用 ibmcloud ce subscription cron update 命令。 例如,更新 mycronevent 预订以更改调度,从而每 2 分钟向名为 myapp 的应用程序发送一次事件。

ibmcloud ce sub cron update --name mycronevent --schedule '*/2 * * * *'

要验证 cron 预订是否已成功更新,请运行 ibmcloud ce sub cron get --name mycronevent 命令。 已更新预订的调度。

示例输出

Getting cron source 'mycronevent'...
OK

Name:          mycronevent
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           2m21s
Created:       2021-08-31T16:00:49-04:00

Destination Type:  job
Destination:       myjob
Schedule:          */2 * * * *
Time Zone:         UTC
Content Type:      application/json
Data:              { "message": "Hello world!" }
Ready:             true

Events:
  Type    Reason                       Age               Source                 Messages
  Normal  PingSourceSynchronized       7s (x3 over 13m)  pingsource-controller  PingSource adapter is synchronized

从控制台查看作业的事件信息

要查看有关事件预订的信息,

  1. Code Engine "项目" 页面,转至您的项目。
  2. 从“概述”页面,单击 事件预订 以查看已定义的预订的列表。

如果作业像样本 codeengine 作业一样将信息打印到日志文件,请查看事件使用者作业的日志文件。 请参阅 从控制台查看作业日志

使用 CLI 查看作业的事件信息

如果您的作业像样本 codeengine 作业一样将信息打印到日志文件,那么您可以找到从定期计时器 (cron) 事件创建的作业运行,然后查看作业运行日志。 例如,要查找先前示例中针对作业运行的作业,

ibmcloud ce jobrun list

示例输出

Listing job runs...
OK

Name         Failed  Pending  Requested  Running  Succeeded  Unknown  Age
myjob-kd829  0       0        0          0        1          0        43s

通过指定作业运行名称来查看作业运行的日志。

ibmcloud ce jobrun logs --jobrun myjob-kd829

示例输出

Hello from helloworld! I'm a batch job! Index: 0

Hello World from:
. ___  __  ____  ____
./ __)/  \(    \(  __)
( (__(  O )) D ( ) _)
.\___)\__/(____/(____)
.____  __ _   ___  __  __ _  ____
(  __)(  ( \ / __)(  )(  ( \(  __)
.) _) /    /( (_ \ )( /    / ) _)
(____)\_)__) \___/(__)\_)__)(____)

Some Env Vars:
--------------
CE_DATA={ "message": "Hello world!" }
CE_ID=abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
CE_SOURCE=/apis/v1/namespaces/1234abcd1a2/pingsources/mycroneventjob
CE_SPECVERSION=1.0
CE_TIME=2021-04-13T17:41:00.429658447Z
CE_TYPE=dev.knative.sources.ping
CONTENT_TYPE=application/json
HOME=/root
HOSTNAME=myjob-mpps4-0-0
JOB_INDEX=0
KUBERNETES_PORT=tcp://172.21.0.1:443
KUBERNETES_PORT_443_TCP=tcp://172.21.0.1:443
KUBERNETES_PORT_443_TCP_ADDR=172.21.0.1
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_HOST=172.21.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1

请注意,作业运行的日志信息仅持续一个小时。 有关日志记录的更多信息,请参阅 查看日志

有关 cron 发送的环境变量的更多信息,请参阅 事件的环境变量

要查找更多代码示例吗? 请查看 IBM Cloud Code Engine GitHub 存储库的样本

传递到作业的事件的环境变量

传递到作业的所有事件都将作为环境变量接收。 这些环境变量包含前缀 CE_,并且基于 CloudEvents spec

每个事件都包含一些公共环境变量,每次将事件传递到作业时都会显示这些变量。 每个事件中的实际变量集可以包含更多选项。 有关更多信息,请参阅 CloudEvent 属性

下表描述了特定于 cron 事件的环境变量。

事件环境变量
变量 描述
CE_DATA 事件的数据 (主体)。 请参阅 CE_DATA 以获取 cron 事件
CE_ID 事件的唯一标识,除非事件已重放,在这种情况下,将为其分配相同的标识。
CE_SOURCE 用于指示此事件在事件生产者中的起源位置的 URI 引用。 对于 cron 事件,这是具有项目子域的 URI 引用以及 cron 预订的名称,格式如下: /apis/v1/namespaces/[PROJECT_SUBDOMAIN]/pingsources/[SUBSCRIPTION_NAME]
CE_SPECVERSION CloudEvents 规范的版本。 该值始终为 "1.0
CE_TIME 事件发生的时间。
CE_TYPE 事件类型。 对于 cron 事件,这是 dev.knative.sources.ping

CE_DATA 环境变量

对于定期计时器事件,CE_DATA 环境变量包含事件本身,并且采用您在创建或更新预订时指定的格式。

示例输出

CE_DATA={ "message": "Hello world!" }
CE_ID=abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
CE_SOURCE=/apis/v1/namespaces/1234abcd1a2/pingsources/mycroneventjob
CE_SPECVERSION=1.0
CE_TIME=2021-04-13T17:41:00.429658447Z
CE_TYPE=dev.knative.sources.ping

定义其他事件属性

创建预订时,可以定义要包含在生成的任何事件中的其他事件属性。 这些事件属性与事件交付中的任何其他 CloudEvent 属性类似。 如果选择指定现有 CloudEvent 属性的名称,那么它将覆盖事件中包含的原始值。 有关更多信息,请参阅 我可以使用其他 CloudEvents 规范吗?

在控制台中,可以从定期计时器 (cron) 事件预订的 常规 选项卡将事件属性指定为键/值对。

通过 CLI,要定义其他属性,请将 --extension 选项与 ibmcloud ce sub cron create CLI 命令配合使用。

删除预订

当您不再需要定期计时器 (cron) 预订时,可以将其删除。

从控制台删除订阅

  1. Code Engine "项目" 页面,转至您的项目。
  2. 从“概述”页面,单击 事件预订 以查看已定义的预订的列表。
  3. 从预订列表中,删除要从应用程序或作业中除去的预订。

如果删除应用程序或作业,那么不会删除预订。

使用 CLI 删除预订

您可以通过运行 ibmcloud ce sub cron deleteibmcloud ce sub cos delete 命令来删除预订。

例如,删除名为 mycronevent2 的 cron 预订,

ibmcloud ce subscription cron delete --name mycronevent2

如果删除应用程序或作业,那么不会删除预订。 相反,在 CLI 中,预订将进入 false 的就绪状态,因为预订取决于应用程序或作业的可用性。 如果重新创建应用程序或作业 (或者具有相同名称的其他应用程序或作业),那么您的预订将重新连接,并且“就绪”状态为 true