触发选项
trigger() 和 triggerAndWait() 的第二个参数支持丰富的触发选项。
延迟执行
// 延迟 5 秒执行
await myTask.trigger(payload, { delay: 5000 });
// 延迟 10 分钟执行
await myTask.trigger(payload, { delay: '10m' });
当 delaySafe 能力可用时(有持久化存储),延迟通过 ScheduleClock 持久化轮询实现——即使 tab 刷新也不会丢失。否则降级为 setTimeout。
重试配置
const myTask = rxdb.trigger.task({
id: 'my-task',
retry: {
maxAttempts: 5, // 最大重试次数(含首次执行)
factor: 2, // 退避因子
minTimeoutInMs: 1000, // 最小退避间隔
maxTimeoutInMs: 30000, // 最大退避间隔
randomize: true // 随机抖动
},
run: async (payload, ctx) => {
/* ... */
}
});
每次失败后,延迟时间按指数退避计算:min(minTimeout * factor^attempt, maxTimeout)。
幂等键
防止重复触发同一任务:
await myTask.trigger(payload, {
idempotencyKey: `order-${orderId}`
});
相同幂等键在保留期内(默认 14 天)只会创建一个 Run。
并发控制
队列级并发
在 task 定义时设置队列并发上限:
const myTask = rxdb.trigger.task({
id: 'sync-data',
queue: { name: 'sync', concurrencyLimit: 1 },
run: async (payload, ctx) => {
/* ... */
}
});
并发键
同一 concurrencyKey 的任务同时只允许一个执行:
await myTask.trigger(payload, {
concurrencyKey: `user-${userId}`
});
超时控制
const myTask = rxdb.trigger.task({
id: 'long-task',
maxDuration: 60_000, // 60 秒超时
run: async (payload, ctx) => {
// 通过 ctx.signal 监听取消
const res = await fetch(url, { signal: ctx.signal });
return res.json();
}
});
超时后 Run 状态变为 TIMED_OUT。
TTL
为单次触发设置过期时间:
await myTask.trigger(payload, {
ttl: '1h' // 1 小时后过期(若仍未执行)
});
QUEUED 或 DELAYED 状态的 Run 超过 TTL 后被标记为 EXPIRED。
标签与元数据
await myTask.trigger(payload, {
tags: ['priority:high', 'source:webhook'],
metadata: { correlationId: 'abc-123' }
});
标签和元数据在 RunInfo 中可查询,便于分类和追踪。
持久化策略
控制敏感数据的存储方式:
const sensitiveTask = rxdb.trigger.task({
id: 'process-payment',
persistencePolicy: 'metadata-only', // 'full' | 'metadata-only' | 'none'
run: async (payload, ctx) => {
/* ... */
}
});
| 策略 | payload/output 落盘 | DevTools 可见 |
|---|---|---|
full | 是 | 是 |
metadata-only | 否 | 否 |
none | 不持久化 | 否 |
批量触发
一次性触发多个相同任务的 Run:
const batch = await myTask.batchTrigger([
{ payload: { id: 1 } },
{ payload: { id: 2 }, options: { delay: 5000 } },
{ payload: { id: 3 } }
]);
console.log('Batch ID:', batch.batchId);
console.log('Run 数量:', batch.runs.length);
批量写入使用 saveMany(30) 分块,避免大事务阻塞。