@ c轨道/ cron
在协调世界时5个战地克龙时间表上唤醒交流剂的轨道中心模块,作为 @intx/hub-api 中心(Interchange的多租户控制平面)上的路由,并存储在它的Postgres. 一个计时器邮件会按其代理的当前运行,代理的工作流程定义的运行实例来发送每个到期的调度.
调度支持创建、列表、暂停、恢复和删除。 没有编辑:删除再创建。 一个表达式必须能够起火(没有2月30日),最多256个字符和64个逗号条款.
为什么?
- 计划跟随代理,而不是运行. 一个调度按其定义名称命名一个代理,所以它能活下来重新部署. 它等待代理机没有当前运行,当代理机被删除时会永远停止.
- 就像任何枢纽路线一样.
createCronRoutes返回 aHono<TenantEnv>子应用程序。 每条路线都穿过枢纽requireGrant,检查呼叫主(用户或代理账户)持有赠款(资源许可). - 安全带几个枢纽复制品. 计票人申请到期行数
FOR UPDATE SKIP LOCKED,所以没有时间表 点火两次。 移民是一能的,在每个靴子上都有一个咨询锁.
安装
bun add @corbits/cron @intx/authz @intx/db @intx/hub-api drizzle-orm hono postgres
运行于节点QQ24.
快速启动
import { nextCronFireAfter } from "@corbits/cron";
console.log(nextCronFireAfter("0 9 * * *", new Date()));
打印下09: 00 UTC, 下一次显示该表达点火的时间表 .
合适的话
互换 由AI代理作为主要负责人,拥有自己的身份,权限和证书. 其中心拥有租户、校长、赠款和工作流程运行.
- 运行于 : 作为其Hono应用软件上的路线, 其过程中的滴答和其Postgres中的桌子.
- 插入到 :
@intx/hub-api路线和赠款,以及@intx/db(数量)DBConfig页:1tenant表格作为 FK 目标,及其工作流程定义和运行). - 与 :
@corbits/webhooks以及其他轨道中心模块,@corbits/mailbox财务报告和审定财务报表@corbits/artifacts。 。 。 .
参考文献
createCronRoutes(deps)
deps | 类型 | 主机提供的东西 |
|---|---|---|
db | CronDb | 枢纽的细雨柄. |
requireGrant | RequireGrant | 从 @intx/hub-api是因为 createRequireGrant。 。 。 . |
路线
路径相对于主机上载子应用程序的位置.
| 方法 | 路径 | 赠款 | 目的 |
|---|---|---|---|
| 获取 | / | cron-schedule:* read | { schedules: [...] } 给打电话的房客. |
| 邮政 | / | cron-schedule:* create | 从 { expression, definitionName, subject, body }. 201 (中文(简体) ) { schedule }; 400 (英语) invalid_body, (中文(简体) ), invalid_expression 或者说 unknown_definition。 。 。 . |
| 邮政 | /:id/pause | cron-schedule:<id> manage | 停止启动它. { schedule } 与 enabled: false; 404 (简体中文) not_found。 。 。 . |
| 邮政 | /:id/resume | cron-schedule:<id> manage | 从接下来的比赛中再次开火. { schedule } 与 enabled: true; 404 (简体中文) not_found。 。 。 . |
| 迪莱特 | /:id | cron-schedule:<id> manage | 删除一个时间表. { ok: true }; 404 (简体中文) not_found 当它不在打电话者的房客. |
createCronTicker(opts)
回返 { start(), stop() }。 。 。 .
每分钟交货最多一次。 每个勾选符先承诺 lastFiredAt 在每行要求,然后打电话 deliver 在锁外 一个死在中段的进程,或者 deliver 投出,投出那分钟的火 而不是重复它; 时刻表再次起火 在它的下一个匹配分钟。 停止并等待回调 在他们的改变承诺后运行.
opts | 类型 | 目的 |
|---|---|---|
db | CronDb | 枢纽的细雨柄. |
deliver | DeliverCronMail | 发送一个到期时间表的邮件. createRunTriggerCronDeliver(deliverer) 建造它. |
intervalMs | number (可选) | 民调期. 默认为60000. |
onTickError | (error) => void (可选) | 发送前失败了 。 接下来的滴答重试. |
onDeliveryError | (error, schedule) => void (可选) | 一次送货失败. |
onScheduleWaiting | (schedule) => void (可选) | 日程安排开始等待它的代理下一个运行. |
onScheduleStopped | (schedule) => void (可选) | 时间表停止 : reason 实值 agent_deleted,或 invalid_expression 对于一行永远不能开火. |
送货人扔出一个带错误 RUN_GRANTS_NOT_ROUTABLE 或者说 RUN_MAIL_NOT_ROUTABLE (与 isUnroutableRunTrigger当一个跑的地址死了。 如果运行的侧车已经放出,计时器会标记运行失败,所以调度会等待代理的下一场运行.
runCronMigrations(dbConfig, { schema })
从 @corbits/cron/migrations参数与 @intx/db是因为 runMigrations。 。 。 . schema 持有主机 tenant 表格,必须先存在。 计时表总是住在 cron 计划 每只靴子上都叫这个.
其他出口
| 导出 | 使用 |
|---|---|
isValidCronExpression(expression) | 语法,范围与上限检查. POST / 也要求可能发生火灾. |
nextCronFireAfter(expression, after) | 在协调世界时之后的下一分钟 after。 。 。 . |
isUnroutableRunTrigger(error), (中文(简体) ), RUN_GRANTS_NOT_ROUTABLE, (中文(简体) ), RUN_MAIL_NOT_ROUTABLE | 死亡地址错误与送货人合同如下. |
CronRoutesDeps, (中文(简体) ), CreateCronTickerOpts, (中文(简体) ), CronTicker, (中文(简体) ), CronDb, (中文(简体) ), DeliverCronMail, (中文(简体) ), RunTriggerDeliverer, (中文(简体) ), UnroutableRunTrigger | 以上各类. |
使用互换
运行每个枢纽靴子上的迁移 并构建路线:
import { timeWindowEvaluator } from "@intx/authz";
import { createDB, createGrantStore, runMigrations } from "@intx/db";
import { createRequireGrant } from "@intx/hub-api";
import { createCronRoutes } from "@corbits/cron";
import { runCronMigrations } from "@corbits/cron/migrations";
const dbConfig = {
host: "localhost",
port: 5432,
user: "postgres",
password: "postgres",
database: "interchange",
};
await runMigrations(dbConfig, { schema: "public" });
await runCronMigrations(dbConfig, { schema: "public" });
const { db } = createDB(dbConfig);
export const cronRoutes = createCronRoutes({
db,
requireGrant: createRequireGrant({
grantStore: createGrantStore(db),
conditionRegistry: { time_window: timeWindowEvaluator },
}),
});
挂载 cronRoutes 时间 /cron 下级 /api/tenants/:tenantId在枢纽的认证 和租户中间的软件。 给每本金 cron-schedule:* 与 read 财务报告和审定财务报表 create 以列表和创建,以及 manage 联 合 国 cron-schedule:* 或一个 cron-schedule:<id>删除. POST /cron 与 { "expression": "0 9 * * *", "definitionName": "daily-report", "subject": "Run", "body": "go" } 然后邮寄 daily-report 每天协调世界时9: 00 代理.
每个中枢进程启动一个勾选器 createCronTicker({ db, deliver: createRunTriggerCronDeliver(deliverer) })时 deliverer 是枢纽的跑动触发器 @corbits/webhooks' createRunTriggerDeliverer调用 ticker.stop() 关闭。 在起火时 滴答邮件 <run id>@<tenant domain> 对于代理当前运行,所以代理工作流程需要一个 mail 触发。 复制品安全地共享桌子.
从0.1升级
mountCron(app, opts)改为:app.route(path, createCronRoutes({ db, requireGrant }))。路线不再在/api/tenants/:tenantId/cron但无论宿主上哪儿都行.requireTenantMember不见了 每个路线检查acron-schedule所以校长在申请之前需要这些补助 或者他们得到403.applyCronMigrations(url, { tenantSchema })现在runCronMigrations(dbConfig, { schema })从@corbits/cron/migrations。通过旧的tenantSchema值为schema。 。 。 .cronScheduleTable, (中文(简体) ),CRON_FIELD_RANGES, (中文(简体) ),cronExpressionCanFire, (中文(简体) ),isValidTimeZone, (中文(简体) ),zonedParts, (中文(简体) ),MAX_LOOKAHEAD_MINUTES, (中文(简体) ),resolveLiveDeployment, (中文(简体) ),definitionExists, (中文(简体) ),failStaleAnchorRun类型CronField, (中文(简体) ),ZonedParts, (中文(简体) ),LiveDeployment, (中文(简体) ),MountCronOpts, (中文(简体) ),RequireTenantMember不再出口.@intx/db, (中文(简体) ),@intx/hub-api, (中文(简体) ),drizzle-orm, (中文(简体) ),hono财务报告和审定财务报表postgres现在已经是同龄人了.createCronTicker是因为intervalMs是可选的,默认为1分钟.- 现有数据库升级到第一个启动时没有手动步骤。 每0.1.0时刻表保持状态并持续开火.
许可证
LGPL-2.1-仅限. 见 自由主义。 。 。 .