Cron 调度
@aiao/rxdb-plugin-trigger 提供内置的 cron 调度能力,支持持久化定时任务。
注册调度任务
const dailyReport = rxdb.trigger.schedules.task({
id: 'daily-report',
cron: '0 9 * * *', // 每天 9:00
timezone: 'Asia/Shanghai',
catchUpPolicy: 'once',
run: async (payload, ctx) => {
// payload 包含调度信息
console.log('调度时间:', payload.timestamp);
console.log('上次执行:', payload.lastTimestamp);
console.log('调度 ID:', payload.scheduleId);
return generateReport();
}
});
管理调度
创建调度
const schedule = await rxdb.trigger.schedules.create({
task: 'daily-report',
cron: '0 9 * * *',
timezone: 'Asia/Shanghai',
catchUpPolicy: 'once'
});
查询调度
// 查询单个调度
const info = await rxdb.trigger.schedules.retrieve(schedule.id);
// 列出所有调度
const all = await rxdb.trigger.schedules.list();
// 按任务 ID 过滤
const taskSchedules = await rxdb.trigger.schedules.list('daily-report');
暂停与恢复
// 暂停调度
await rxdb.trigger.schedules.deactivate(schedule.id);
// 恢复调度(自动重新计算下次触发时间)
await rxdb.trigger.schedules.activate(schedule.id);
更新与删除
// 更新 cron 表达式
await rxdb.trigger.schedules.update(schedule.id, {
cron: '0 10 * * *' // 改为每天 10:00
});
// 删除调度
await rxdb.trigger.schedules.del(schedule.id);
Catch-up 策略
当应用长时间未打开(例如用户关闭浏览器过夜),恢复后可能有多个 missed tick。catchUpPolicy 控制如何处理:
| 策略 | 行为 |
|---|---|
skip | 忽略所有 missed tick,只从当前时间开始调度 |
once | 只补一次最近的 missed tick |
replay-all | 按顺序重放所有 missed tick |
await rxdb.trigger.schedules.create({
task: 'sync-data',
cron: '*/5 * * * *',
catchUpPolicy: 'replay-all' // 恢复后补齐所有错过的 5 分钟周期
});
SchedulePayload
调度触发的任务会收到特殊的 payload:
interface SchedulePayload {
timestamp: string; // 当前触发时间(ISO 8601)
lastTimestamp?: string; // 上次触发时间
timezone: string; // 时区
scheduleId: string; // 调度 ID
upcoming: string[]; // 接下来的触发时间列表
}
Leader-only 轮询
调度轮询只在 Leader tab 上执行(通过 Web Locks 选举),避免多 tab 重复触发。即使 Leader tab 关闭,其他 tab 会自动接管 Leader 角色。
轮询间隔通过 scheduleTickInterval 配置(默认 2000ms)。