# 延迟任务队列

Aegis.Jobs是框架提供的一种高可用的延迟任务组件。可以用于在指定时间后执行某个方法,精度可以达到50ms。

如何引入

延迟任务组件包含在Aegis.Jobs的Nuget包中。如果只引入该包,默认只提供内存版本。

同时还提供了基于 SQLServer 任务持久化扩展Nuget包Aegis.Jobs.SqlServer,强烈推荐引入持久化包。

在引入Nuget包后,请确认Component.deps.json配置文件中的Services节点中含有Jobs

1000

延迟任务持久化

Aegis.Jobs.SqlServerAegis.Jobs的持久化队列包,引入了很多任务队列的分布式特性,但是因为需要确保任务的持久化留存,在任务写入方面会比原始版本慢一些。

  • 任务状态留存
  • 分布式执行
  • 任务持久化
  • 任务宕机恢复

引入持久化包

延迟任务持久化包(SQLServer) 包含在Aegis.Jobs.SqlServer的Nuget包中。

在引入Nuget包后,请确认Component.deps.json配置文件中的Services节点中含有Jobs.SqlServer,且确保他在Jobs的后面。

image.png|1000

在AppSettings(或单独的配置文件中),确保有JobPersistenceConnection配置节点,并且配置正确的连接字符串,该连接只用于延迟任务队列,无需配置太大的连接池,如果延迟任务特别多的情况下酌情放大即可。 image.png|1000

如何使用

调度专门的类实例方法

AegisJob.Schedule<UserJob>(x => x.ExecuteAsync(id, statusCode), TimeSpan.FromMilliseconds(100));

这是最推荐的用法,用于调度实现了特定接口/基类的 UserJob 类型的异步实例方法 ExecuteAsync。框架负责实例创建和依赖注入。延迟 100 毫秒执行。

调度当前上下文方法或静态方法

AegisJob.Schedule(() => ChangeUser(id, statusCode), TimeSpan.FromSeconds(15));

用于调度当前类中的实例方法或任意静态方法 ChangeUser。Lambda 表达式直接捕获调用。延迟 15 秒执行。

调度静态方法 (示例)

AegisJob.Schedule(() => Console.WriteLine("静态方法调用"), TimeSpan.FromMinutes(15));

直接调度 .NET 的静态方法 Console.WriteLine(可以是代码内的任何静态方法)。延迟 15 分钟执行。

调度服务类实例方法

AegisJob.Schedule<TestService>(x => x.Hello(), TimeSpan.FromDays(1));

用于调度 DI 容器中注册的服务 TestService 的实例方法 Hello(这里也可以获取其他容器内服务)。框架通过 DI 容器获取服务实例。延迟 1 天执行。

持久化特性

表说明

JobData(任务具体数据)

image.png|1000

JobState(状态相关的表)

image.png|1000

状态说明

  • Scheduled (已计划): 任务的初始状态。任务被创建并等待到达预定的执行时间,该状态代表被写入数据库,但是还没有进入任何机器上的任务队列中。
  • Queued (已入队): 预定执行时间到达,任务已被写入任务待处理队列,等待工作线程获取。
  • Processing (处理中): 工作线程获取任务并开始执行其实际逻辑。
  • Canceled (已取消): 任务在执行前被主动取消,不会被执行。
  • Aborted (已中止): 任务在处理过程中被强制中断或异常终止(如进程重启)。持久化队列通常会尝试恢复。
  • Succeed (已成功): 任务逻辑顺利完成,没有未处理异常。
  • Failed (已失败): 任务逻辑执行过程中抛出未处理异常。可能根据配置进行重试,最终保持失败状态。

状态流转图

stateDiagram [*] --> Scheduled: 创建任务 Scheduled --> Queued: 时间到达 Scheduled --> Canceled: 手动取消 Queued --> Processing: 工作线程获取 Queued --> Canceled: 手动取消 Processing --> Succeeded: 执行成功 Processing --> Failed: 执行失败 Processing --> Aborted: 系统中止/重启 Failed --> Queued: 配置重试 Aborted --> Queued: 宕机恢复 Succeeded --> [*]: 结束 Failed --> [*]: 结束(无重试或重试耗尽) Canceled --> [*]: 结束

results matching ""

    No results matching ""