跳到主要内容

@aiao/rxdb-plugin-trigger

@aiao/rxdb-plugin-trigger 是一个 browser-first 的任务运行时插件,为 RxDB 提供持久化任务调度与执行能力。

核心特性

  • 持久化任务队列:Run/Schedule/Workflow 全部建模为 RxDB Entity,刷新不丢失
  • 多 Tab 安全:通过条件 UPDATE SQL 实现 CAS(Compare-And-Swap),保证跨 tab 执行权唯一
  • Cron 调度:支持 cron 表达式定时触发,含 missed tick catch-up 策略
  • Workflow DAG:基于 WorkflowJSON 的有向无环图编排,支持条件分支、并行扇出/汇聚、节点重试
  • Entity 触发器:监听 Entity 变更(create/update/remove)自动触发任务
  • 三框架支持:React hooks、Angular injectables、Vue composables 开箱即用
  • 运行时能力探测:自动检测 IndexedDB、Web Locks、Worker 可用性,不可用时优雅降级
  • at-least-once 语义:所有副作用要求幂等,crash recovery 内置

安装

npm install @aiao/rxdb-plugin-trigger

快速开始

1. 注册插件

import { RxDB } from '@aiao/rxdb';
import { rxDBPluginTrigger } from '@aiao/rxdb-plugin-trigger';

const rxdb = new RxDB({
/* ... */
});

rxdb.use(rxDBPluginTrigger, {
runRetentionDays: 3,
metadataRetentionDays: 7,
scheduleTickInterval: 2000
});

2. 定义并注册任务

const processOrder = rxdb.trigger.task({
id: 'process-order',
retry: { maxAttempts: 3, factor: 2, minTimeoutInMs: 1000 },
queue: { concurrencyLimit: 2 },
maxDuration: 30_000,
run: async (payload, ctx) => {
ctx.progress(10, '开始处理订单');
const result = await handleOrder(payload.orderId);
ctx.progress(100, '完成');
return result;
},
onSuccess: async ({ output }) => {
console.log('订单处理成功:', output);
},
onFailure: async ({ error }) => {
console.error('订单处理失败:', error.message);
}
});

3. 触发任务

// 异步触发,立即返回 RunHandle
const handle = await processOrder.trigger({ orderId: '12345' });
console.log('Run ID:', handle.id);

// 同步等待结果
const result = await processOrder.triggerAndWait({ orderId: '12345' });
if (result.ok) {
console.log('输出:', result.output);
}

4. 管理运行记录

// 查询运行详情
const run = await rxdb.trigger.runs.retrieve(handle.id);

// 取消运行
await rxdb.trigger.runs.cancel(handle.id);

// 重放运行
await rxdb.trigger.runs.replay(handle.id);

运行状态流

任务运行遵循以下状态机:

架构总览

插件选项

选项类型默认值说明
runRetentionDaysnumber3完成的 Run 保留天数
metadataRetentionDaysnumber7metadata-only Run 保留天数
idempotencyRetentionDaysnumber14幂等键保留天数
scheduleTickIntervalnumber2000Schedule 轮询间隔(ms)
leaseDurationMsnumber300000执行锁租约时长(ms)
leaseRenewalMsnumber120000租约续期间隔(ms)
enableWorkflowbooleantrue启用 Workflow 引擎
catchUpPolicyCatchUpPolicy'once'Schedule 默认 catch-up 策略
syncPolicySyncPolicy'none'远端同步策略

运行时能力

插件在 install() 时自动检测浏览器能力:

const caps = rxdb.trigger.capabilities;
// {
// persistent: true, // IndexedDB 可用
// delaySafe: true, // 延迟任务可持久化
// scheduleSafe: true, // Cron 调度安全
// leaderElectionSafe: true, // Web Locks 可用
// workflowSafe: true, // Workflow 可持久化
// workerSafe: true, // Worker 可用
// }

相关文档