ABP 后台作业和后台任务实现

本文介绍了如何在ABP框架中使用BackgroundJobs和Quartz模块进行后台任务的定义、执行以及管理,包括创建任务类、服务层调用、定时任务调度、数据库存储配置等内容,确保系统的稳定性和任务可靠性。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

后台作业:

为执行长时间运行任务而用户无需等待,为创建可重试且稳定的任务来保证一个代码将会被成功运行,提高系统的稳定性

https://docs.abp.io/zh-Hans/abp/latest/Background-Jobs

1)定义任务类和要执行的逻辑

创建JobClass:BackgroundJob<propertyObj>, ITransientDependency,并重写Execute方法 2)service或domain层调用作业任务

引用IBackgroundJobManager _manager

调用_manager.EnqueueAsync(obj)执行后台作业,可通过参数控制是否延后多久执行等

后台任务:

独立现场,定期执行一些任务

https://docs.abp.io/zh-Hans/abp/latest/Background-Workers

 方案一:

1)创建服务类ServiceA:BackgroundWorkerBase(在IBackgroundWorker上提供了像Logger等常用属 性),重写start和stop方法。

2)或者ServiceA:AsyncPeriodicBackgroundWorkerBase(简化了创建定期工作者的过程),继承和重写父类的AbpTimer(定义执行周期)和IServiceScopeFactory,重写DoWork方法

3)在abpmodule中依赖AbpBackgroundWorkersModule,OnApplicationInitializationAsync添加 context.AddBackgroundWorkerAsync<ServiceA>(); 也可以在应用程序的任何地方注入 IBackgroundWorkerManager并在运行时添加工作者

方案二:

引入Quartz

1)abpmodule中依赖AbpBackgroundWorkersQuartzModule

2)创建 ServiceLaunchTrigger:QuartzBackgroundWorkerBase

3)构造方法中赋值JobDetail和Trigger,

JobDetail = JobBuilder.Create<ServiceLaunchTrigger>().WithIdentity("ServiceLaunch").Build();

Trigger = TriggerBuilder.Create().WithIdentity("ServiceLaunchTrigger").StartNow().Build();

4)重写Execute方法,默认单例,默认后台工作者会在应用程序启动时自动添加BackgroundWorkerManager。注意事务using (var uow = _unitOfWorkManager.Begin(true)){ await uow.CompleteAsync();}

方案三:

引入Quartz

1)创建CheckJob : IJob, ISingletonDependency,重写Execute方法

2)service或domain中引入IScheduler,创建job和trigger,开启定时任务,任务开启后会自动添加到数据库中,服务下次启动的时候,会读取数据库再次开始执行任务。

var job = JobBuilder.Create<CheckJob>()

.WithIdentity(jobKeyValue, _group)

.Build();

var trigger = TriggerBuilder.Create()

.WithIdentity(jobKeyValue + "Trigger", _group)

.StartNow()

.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 0).WithMisfireHandlingInstructionFireAndProceed())

.Build();

await _scheduler.ScheduleJob(job, trigger);

3)一次性执行在给定时刻单次执行作业,或者在给定时间触发作业且重复多次,用SimpleTrigger配置,RepateCount、Interval。类似日历的时间表去触发,例如每周五上午或每月10天15点,用CronTrigger(cron maker自动生成),配置CronSchedule。

4)WithMisfireHandlingInstructionFireAndProceed,Misfire指:周期性的任务在规定的某个时间执行但由于某种原因未执行,补偿机制:DoNothing(忽略不触发立即执行等待下次),IgnoreMisfires(立即把错过的都执行一遍),FireAndProceed(默认,以当前时间未触发频率立刻触发一次执行然后按照配置频率依次执行)

 补充:abp配置Quartz存储任务到数据库里

 1,HttpApiHostModule的PreConfigureServices加配置:

 PreConfigure<AbpQuartzOptions>(options =>
            {
                options.Configurator = configure =>
                {
                    configure.UsePersistentStore(storeOptions =>
                    {
                        storeOptions.UseProperties = false;
                        storeOptions.UseJsonSerializer();
                        storeOptions.UsePostgres("User ID=postgres;Password=pasword;Host=localhost;Port=5432;Database=DBName;"));
                    });//改为自己的数据库
                };
            });

2,在官网里找到Quartz的数据库表,加到自己的数据库里。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值