Skip to main content

触发器管理(Triggers)

触发器用于将外部事件(Webhook、定时任务、消息队列等)与工作流解耦,可以为同一个工作流配置多种触发方式。

触发器管理(/api/workflows/workflowId/triggers,/api/triggers)

  • 列表:GET /linker/workflows/{workflowId}/triggers
  • 创建:POST /linker/workflows/{workflowId{/triggers
  • 获取:GET /linker/triggers/<triggerId>
  • 更新:PUT /linker/triggers/<triggerId>
  • 删除:DELETE /linker/triggers/<triggerId>
  • 查看事件收件箱:GET /linker/triggers/<triggerId>/events?page=&size=
  • Webhook 触发:POST /linker/triggers/webhook/<triggerId>

Trigger 对象结构(TriggerDef)

常见字段(参考后端 TriggerDefEntityTriggerController.TriggerDefDetail):

  • id:触发器 ID
  • type:触发类型,枚举值:
    • WEBHOOK:通过 HTTP Webhook 触发
    • CRON:定时任务触发
    • MQ:消息队列触发
  • name:名称
  • enabled:是否启用
  • workflowApiKey:绑定的工作流 apiKey
  • inputTemplate:输入模板,用于将触发事件转换为工作流的 Start 输入

Webhook 类型专用字段:

  • webhookSignatureHeader:签名头部名称(默认:X-Signature
  • webhookTimestampHeader:时间戳头部名称(默认:X-Timestamp
  • webhookMaxSkewSeconds:允许的时间偏移秒数(默认约 300 秒)
  • webhookHasSecret:是否配置了 Webhook 密钥(只读,用于前端展示)

Cron 类型专用字段:

  • cronExpression:Cron 表达式(例如 0 */5 * * * ?
  • cronTimezone:时区(例如 Asia/Shanghai
  • cronNextFireAt:下次计划触发时间(只读,由调度器计算)

MQ 类型专用字段:

  • mqDriver:消息驱动类型(例如 kafkarabbitmq,视实现而定)
  • mqQueue:队列 / Topic 名称

审计字段:

  • createdAt:创建时间
  • updatedAt:更新时间

创建与更新 Trigger

  • 创建:通过 POST /linker/workflows/<workflowId>/triggers 绑定到指定工作流
  • 更新:通过 PUT /linker/triggers/<triggerId> 局部更新字段(仅请求体中出现的字段会被修改)

更新时的类型特定行为:

  • 当类型为 WEBHOOK 时,可更新:
    • webhookSecret
    • webhookSignatureHeader
    • webhookTimestampHeader
    • webhookMaxSkewSeconds
  • 当类型为 CRON 时:
    • 更新 cronExpressioncronTimezone 会自动重置内部的 cronNextFireAt,由调度器重新计算
  • 当类型为 MQ 时:
    • 可更新 mqDrivermqQueue

示例:更新 Webhook 触发器的签名配置:

curl -X PUT "${API_BASE}/linker/triggers/<triggerId>" \
-H "Authorization: Bearer ${TOKEN}" \
-H "X-Tenant-Id: <tenantId>" \
-H "Content-Type: application/json" \
-d '{
"name": "Order Webhook",
"enabled": true,
"webhookSecret": "my-signing-secret",
"webhookSignatureHeader": "X-Signature",
"webhookTimestampHeader": "X-Timestamp",
"webhookMaxSkewSeconds": 300
}'