# 延迟任务队列
Aegis.Jobs
是框架提供的一种高可用的延迟任务组件。可以用于在指定时间后执行某个方法,精度可以达到50ms。
如何引入
延迟任务组件包含在Aegis.Jobs
的Nuget包中。如果只引入该包,默认只提供内存版本。
同时还提供了基于 SQLServer 任务持久化扩展Nuget包
Aegis.Jobs.SqlServer
,强烈推荐引入持久化包。
在引入Nuget包后,请确认Component.deps.json
配置文件中的Services
节点中含有Jobs
延迟任务持久化
Aegis.Jobs.SqlServer
是Aegis.Jobs
的持久化队列包,引入了很多任务队列的分布式特性,但是因为需要确保任务的持久化留存,在任务写入方面会比原始版本慢一些。
- 任务状态留存
- 分布式执行
- 任务持久化
- 任务宕机恢复
引入持久化包
延迟任务持久化包(SQLServer) 包含在Aegis.Jobs.SqlServer
的Nuget包中。
在引入Nuget包后,请确认Component.deps.json
配置文件中的Services
节点中含有Jobs.SqlServer
,且确保他在Jobs
的后面。
在AppSettings(或单独的配置文件中),确保有JobPersistenceConnection
配置节点,并且配置正确的连接字符串,该连接只用于延迟任务队列,无需配置太大的连接池,如果延迟任务特别多的情况下酌情放大即可。
如何使用
调度专门的类实例方法
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(任务具体数据)
JobState(状态相关的表)
状态说明
Scheduled
(已计划): 任务的初始状态。任务被创建并等待到达预定的执行时间,该状态代表被写入数据库,但是还没有进入任何机器上的任务队列中。Queued
(已入队): 预定执行时间到达,任务已被写入任务待处理队列,等待工作线程获取。Processing
(处理中): 工作线程获取任务并开始执行其实际逻辑。Canceled
(已取消): 任务在执行前被主动取消,不会被执行。Aborted
(已中止): 任务在处理过程中被强制中断或异常终止(如进程重启)。持久化队列通常会尝试恢复。Succeed
(已成功): 任务逻辑顺利完成,没有未处理异常。Failed
(已失败): 任务逻辑执行过程中抛出未处理异常。可能根据配置进行重试,最终保持失败状态。