You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何停止agenda定时任务内部正在运行的函数的执行

Agenda运行中任务终止方案

agenda的cancel()方法只会删除调度队列中的待执行任务,不会干预已经启动的执行中进程,需要通过自定义终止标记的方式实现运行中任务的中断,实现步骤如下:

1. 新增终止标记存储

根据部署场景选择标记存储方式:

  • 单实例部署可直接使用全局内存变量
  • 多实例部署可使用Redis、数据库等公共存储
// 单实例场景示例,多实例替换为公共存储读写逻辑
let syncTaskAbortFlag = false

2. 改造startSync方法增加中断检查

将原有同步逻辑拆分为多个短步骤,每个步骤执行前都检查终止标记,触发标记则中断执行:

async function startSync(type) {
  // 入口处先检查终止标记
  if (syncTaskAbortFlag) {
    throw new Error('SYNC_ABORTED')
  }
  // 示例:将原有同步逻辑拆分为多个子步骤
  const syncSteps = [
    getStockList,
    syncBaseInfo,
    syncPriceData,
    updateSyncRecord
  ]
  for (const step of syncSteps) {
    // 每步执行前检查终止标记
    if (syncTaskAbortFlag) {
      // 可在此处添加脏数据回滚、状态重置等业务逻辑
      console.log('同步任务已被手动终止')
      throw new Error('SYNC_ABORTED')
    }
    await step()
  }
  return '同步完成'
}

3. 调整Agenda任务定义

新增任务启动前标记重置、终止异常捕获逻辑:

agenda.define('sync', { concurrency: 1 }, async () => {
  try {
    // 每次任务启动前重置终止标记
    syncTaskAbortFlag = false
    await stockSyncServices.startSync('full')
  } catch (err) {
    if (err.message === 'SYNC_ABORTED') {
      console.log('同步任务收到终止指令,已停止执行')
    } else {
      // 保留原有异常处理逻辑
      console.error('同步任务执行异常', err)
    }
  }
})

4. 实现终止任务的REST接口

接口逻辑分为两步:先取消后续调度任务,再下发终止标记触发运行中任务中断:

// Express框架示例,可替换为你使用的Web框架逻辑
app.post('/api/stop-stock-sync', async (req, res) => {
  // 取消agenda中所有后续的sync调度任务
  await agenda.cancel({ name: 'sync' })
  // 修改终止标记
  syncTaskAbortFlag = true
  res.send({
    success: true,
    message: '终止指令已下发,正在运行的同步任务将很快停止'
  })
})

注意事项

  • 若同步逻辑中存在耗时较长的单步操作,需要在单步逻辑内部也插入终止标记检查点,避免终止指令长时间不响应
  • 多实例部署场景下,需要将终止标记存储到所有实例都可访问的公共存储中,确保无论任务运行在哪个实例都能收到终止信号
  • 可根据业务需求在中断时增加相关日志记录、告警通知逻辑

内容的提问来源于stack exchange,提问作者Alexander Dremin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 00:36:01