跳到主要内容

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)。