Dify 定时触发(trigger-schedule)实测:工作流到点自动跑,和三个必须知道的坑
基于 Dify 1.16.1 实测(2026-08)
📖 摘要:日报自动生成、看板定时刷新、巡检定时告警——这些「到点自动跑」的需求,Dify 用 trigger-schedule 节点实现:它是工作流的「闹钟」入口(替代开始节点),发布后按配置的时间自动启动工作流。本文实测验证了真实定时触发(cron 每分钟连续运行全部成功)、时区行为、失败处理——以及三个交付前必须知道的坑:定时任务失败是静默的、首次发布可能不生效、时间格式只认 12 小时制。
1. 业务场景:工作流需要一个「闹钟」
给客户做数据看板、日报系统时,最常听到的需求是:
每天早上 9 点自动生成昨天的销售日报;每周一自动刷新周报看板;每个整点自动巡检一次服务状态。
人工触发不现实——凌晨的日报没人守着点按钮。工作流需要的是一个「闹钟」:到点自动启动,跑完自动结束,结果落库。
2. 方案:trigger-schedule 节点
Dify 的定时触发是一个入口节点(trigger-schedule,替代 start 作为工作流起点):
- 两种配置模式:
- visual(可视化):按频率选——每小时(指定分钟)、每天(固定时间)、每周(指定星期几)、每月(指定日期)
- cron(表达式):标准 5 段 cron 表达式 + 时区——最灵活,支持「每分钟」级别的细粒度
- 触发机制:工作流发布后,调度器(celery beat)每分钟轮询一次到期的定时计划,到点自动启动工作流运行
- 入口语义:整个工作流从定时节点开始,跑完正常到结束节点——和手动触发的区别只是「谁按了开始键」
3. 整体架构
#mermaid-svg-wMTgDDVnrZmOUTJg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wMTgDDVnrZmOUTJg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wMTgDDVnrZmOUTJg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wMTgDDVnrZmOUTJg .error-icon{fill:#552222;}#mermaid-svg-wMTgDDVnrZmOUTJg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wMTgDDVnrZmOUTJg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wMTgDDVnrZmOUTJg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wMTgDDVnrZmOUTJg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wMTgDDVnrZmOUTJg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wMTgDDVnrZmOUTJg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wMTgDDVnrZmOUTJg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wMTgDDVnrZmOUTJg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wMTgDDVnrZmOUTJg .marker.cross{stroke:#333333;}#mermaid-svg-wMTgDDVnrZmOUTJg svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wMTgDDVnrZmOUTJg p{margin:0;}#mermaid-svg-wMTgDDVnrZmOUTJg .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-wMTgDDVnrZmOUTJg .cluster-label text{fill:#333;}#mermaid-svg-wMTgDDVnrZmOUTJg .cluster-label span{color:#333;}#mermaid-svg-wMTgDDVnrZmOUTJg .cluster-label span p{background-color:transparent;}#mermaid-svg-wMTgDDVnrZmOUTJg .label text,#mermaid-svg-wMTgDDVnrZmOUTJg span{fill:#333;color:#333;}#mermaid-svg-wMTgDDVnrZmOUTJg .node rect,#mermaid-svg-wMTgDDVnrZmOUTJg .node circle,#mermaid-svg-wMTgDDVnrZmOUTJg .node ellipse,#mermaid-svg-wMTgDDVnrZmOUTJg .node polygon,#mermaid-svg-wMTgDDVnrZmOUTJg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wMTgDDVnrZmOUTJg .rough-node .label text,#mermaid-svg-wMTgDDVnrZmOUTJg .node .label text,#mermaid-svg-wMTgDDVnrZmOUTJg .image-shape .label,#mermaid-svg-wMTgDDVnrZmOUTJg .icon-shape .label{text-anchor:middle;}#mermaid-svg-wMTgDDVnrZmOUTJg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wMTgDDVnrZmOUTJg .rough-node .label,#mermaid-svg-wMTgDDVnrZmOUTJg .node .label,#mermaid-svg-wMTgDDVnrZmOUTJg .image-shape .label,#mermaid-svg-wMTgDDVnrZmOUTJg .icon-shape .label{text-align:center;}#mermaid-svg-wMTgDDVnrZmOUTJg .node.clickable{cursor:pointer;}#mermaid-svg-wMTgDDVnrZmOUTJg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wMTgDDVnrZmOUTJg .arrowheadPath{fill:#333333;}#mermaid-svg-wMTgDDVnrZmOUTJg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wMTgDDVnrZmOUTJg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wMTgDDVnrZmOUTJg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wMTgDDVnrZmOUTJg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wMTgDDVnrZmOUTJg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wMTgDDVnrZmOUTJg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wMTgDDVnrZmOUTJg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wMTgDDVnrZmOUTJg .cluster text{fill:#333;}#mermaid-svg-wMTgDDVnrZmOUTJg .cluster span{color:#333;}#mermaid-svg-wMTgDDVnrZmOUTJg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wMTgDDVnrZmOUTJg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wMTgDDVnrZmOUTJg rect.text{fill:none;stroke-width:0;}#mermaid-svg-wMTgDDVnrZmOUTJg .icon-shape,#mermaid-svg-wMTgDDVnrZmOUTJg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wMTgDDVnrZmOUTJg .icon-shape p,#mermaid-svg-wMTgDDVnrZmOUTJg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wMTgDDVnrZmOUTJg .icon-shape .label rect,#mermaid-svg-wMTgDDVnrZmOUTJg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wMTgDDVnrZmOUTJg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wMTgDDVnrZmOUTJg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wMTgDDVnrZmOUTJg :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
到点
未到点
定时计划(cron 表达式 + 时区)
调度器每分钟轮询
自动启动工作流运行
执行节点链
结果落库 / 输出
发布后:计划写入数据库(含下一次运行时间 next_run_at)→ 调度器轮询发现到期 → 启动运行 → 运行完成后自动推进到下一周期。
4. 实测验证(真实定时触发)
实验载体:最小定时工作流(trigger-schedule cron */1 * * * * 每分钟 → LLM 生成一句话 → 结束),时区 Asia/Shanghai,云端 Dify 1.16.1 实测。
结果:连续 4 分钟每分钟自动运行,全部成功,输出正常:
| 07:00:52 | ✅ succeeded | 1.5s | 定时任务运行成功… |
| 07:01:52 | ✅ succeeded | 0.8s | 定时任务运行成功… |
| 07:02:52 | ✅ succeeded | 1.3s | 定时任务运行成功… |
| 07:03:52 | ✅ succeeded | 1.1s | 定时任务运行成功… |
- ✅ 真实定时触发:到点自动启动,无需人工
- ✅ 时区生效:next_run_at 按 Asia/Shanghai 计算(北京时间 15:00 触发 = UTC 07:00)
- ✅ 周期推进:每次运行后自动计算下一次运行时间
5. 关键配置(DSL 结构)
data:
type: trigger–schedule # 入口节点(替代 start)
title: 定时触发器
mode: cron # visual | cron
cron_expression: "*/1 * * * *" # cron 模式:标准 5 段
timezone: Asia/Shanghai # 时区——⚠️ 默认 UTC,国内必须显式设置
desc: 工作流的闹钟
visual 模式(每天 9:00 触发):
mode: visual
frequency: daily
visual_config:
time: "9:00 AM" # ⚠️ 12 小时制,不支持 "09:00"
timezone: Asia/Shanghai
发布流程(⚠️ 两个关键点):
6. 实测坑(三个必须知道)
| 1 | 定时任务失败是静默的 | LLM 模型故意配错:触发照常发生 → 运行失败 → 无运行记录、无触发日志,只有调度器日志里一行 ERROR;下一分钟继续触发(无退避/熔断) | 交付必须设计失败可见性:工作流内部用异常分支 + 通知(webhook/消息);或外部监控调度器日志/定期核对结果 |
| 2 | 首次发布可能不生成定时计划 | 第一次发布后数据库计划表为空,重新发布才写入 | 发布两次兜底;发布后查计划确认 |
| 3 | 时间格式只认 12 小时制 | visual 模式填 “14:30”(24 小时制)报错「Expected HH:MM AM/PM」,小时必须 1-12 | time 用 “2:30 PM” 格式;或直接用 cron 模式(无此限制) |
另外两个容易踩的:
- 时区默认 UTC——不设置会按 UTC 触发(国内差 8 小时)
- 运行记录不显示在常规运行列表——定时触发的运行在数据库里有记录,但 Console 的常规运行列表可能看不到,排查要走数据库或日志
7. 总结
定时触发把「到点自动跑」做成了平台原生能力:cron/visual 双模式、时区支持、周期自动推进,真实触发实测通过。但坑 1(失败静默)是交付红线——定时任务没有人工盯着,失败不可见等于「任务悄悄没跑」,方案里必须设计失败告警。
适合的场景:日报/周报自动生成、数据看板定时刷新、定时巡检与告警、定时拉取外部数据。不适合:对「必须跑成功」有硬性要求的任务(先解决失败可见性再说)。
💬 你用过 Dify 的定时触发吗?定时任务失败了,你是怎么发现的?评论区聊聊。
本文为 Dify 功能实测记录,基于 2026-08 云端 1.16.1 环境,实验数据全部来自真实运行结果。
如果对你有帮助,点赞、收藏、关注,后续会继续实测 Dify 的其他隐藏能力。



