ABP源码分析九:后台工作任务
文主要说明ABP中后台工作者模块(BackgroundWorker)的实现方式,和后台工作模块(BackgroundJob)。ABP通过BackgroundWorkerManager来管理BackgroundJobManager,然后通过BackgroundJobManager来管理BackgroundJob。BackgroundJob就代表一个真正的后台任务。
这两个模块是在ABPKernelModule的PostInitialize完成初始化的。
后台工作者模块
首先浏览下后台工作者模块所涉及到的接口和类。其中BackgroundJobManager属于后台工作模块。其继承自后台工作者模块中的PeriodicBackgroundWorkerBase。
逐个分析这些类和接口
IRunnable/RunnableBase: 定义了启动/终止一个任务的方法的接口和基本实现。共三个方法:start, stop, waittostop. start和stop这两个方法很容易理解,就是启动和终止一个任务。后文再解释waittostop方法。
IBackgroundWorker:没有添加任何新方法,这个接口仅用于标识其对应的实现是一个后台工作任务类,用于在后台执行一些任务。
BackgroundWorkerBase:实现IBackgroundWorker的一个抽象类,同时添加了UOW,Setting 和本地化的一些辅助方法。
IBackgroundWorkerManager/BackgroundWorkerManager: 用于管理后台工作任务 - IBackgroundWorker实例(添加IBackgroundWorker实例到管理器,启动,终止和注销后台任务)。设计一个***Manager接口和类是ABP中设计各个功能块的惯用思路,起到了对外隐藏实现细节的作用,可以认为是Facade设计模式的运用。
PeriodicBackgroundWorkerBase:通过封装AbpTimer实现定时启动执行任务的功能。这个类型定义个一个抽象方法DoWork. AbpTimer最终会定时执行这个方法。
AbpTimer是整个ABP框架实现后台工作的核心类,其实现原理就是通过一个CLR中的timer定时启动执行任务。这里有两个要点值得留意:
第一,用timer有一个弊端,就是当timer间隔时间内,任务如果没执行完,timer就会新建一个线程,从头开始执行这个任务,而上一个线程仍然继续执行,这样就会导致系统中产生的线程过多,一会儿系统的资源就耗尽了。ABP的解决思路是在执行真正的业务方法之前,通过将timer的duetime设为无限大,从而timer就失效了。业务方法执行完以后在恢复timer的设置。
第二,如何知道一个Timer真正结束了呢?也就是说如何知道一个Timer要执行的任务已经完成(这里定义为A效果),同时timer已失效(这里定义为B效果)?ABP通过stop方法实现B,通过WaitToStop实现A效果。WaitToStop会一直阻塞调用他的线程直到_performingTasks变成false,也就是说Timer要执行的任务已经完成(任务完成时会将_performingTasks设为False,并且释放锁)。
后台工作模块
首先浏览下涉及到的接口和类。
BackgroundJobInfo: 用于持久化job信息的实体类,对应于数据库中的表AbpBackgroundJobs。这个实体类有以下属性。一个job对应一个要执行的任务。他又两个很关键的属性JobArgs和JobType。其JobType就是接下来要介绍的IBackgroundJob实例的类型。IBackgroundJobManager最终就是根据这个JobType通过反射恢复出IBackgroundJob实例的。JobArgs就是传入IBackgroundJob实例的Execute方法的实参(这里会被序列化后在赋值给BackgroundJobInfo)。
IBackgroundJob/BackgroundJob:定义一个后台工作任务的接口/和基本实现。具体的后台任务类可从BackgroundJob继承,这是定义最终需要被执行的逻辑的地方。
IBackgroundJobConfiguration/BackgroundJobConfiguration: 配置是否激活后台工作任务功能。
BackgroundJobPriority:后台job的优先级
IBackgroundJobStore/InMemoryBackgroundJobStore: 用于持久化后台任务BackgroundJobInfo。可以实现这个接口将后台任务BackgroundJobInfo存储到数据库。或者你可以使用module-zero,它已经实现了IBackgroundJobStore。如果你正在使用第三方的工作管理者(像Hangfire),那么不需要实现IBackgroundJobStore。
IBackgroundJobManager/BackgroundJobManager, IBackgroundJobManager默认是由BackgroundJobManager实现的。它可以被其他的后台工作提供者替代(Hangfire)。 BackgroundJobManager之所以能在后台执行任务,是因为其继承了PeriodicBackgroundWorkerBase基类,并重写了DoWork方法。
BackgroundJobManager:是PeriodicBackgroundWorkerBase一个派生类,其具体实现了DoWork方法:从BackgroundJobStore(可以自定义实现从数据库中读取)取最多1000个BackgroundJobInfo,然后反射执行BackgroundJobInfo中定义的任务。
下面是一个ABP中通过BackgroundJobManager安排BackgroundJob的例子。
ABP源码分析九:后台工作任务的更多相关文章
- [Abp 源码分析]六、工作单元的实现
0.简介 在 Abp 框架内部实现了工作单元,在这里讲解一下,什么是工作单元? Unit Of Work(工作单元)模式用来维护一个由已经被业务事物修改(增加.删除或更新)的业务对象组成的列表.Uni ...
- [Abp 源码分析]九、事件总线
0.简介 事件总线就是订阅/发布模式的一种实现,本质上事件总线的存在是为了降低耦合而存在的. 从上图可以看到事件由发布者发布到事件总线处理器当中,然后经由事件总线处理器调用订阅者的处理方法,而发布者和 ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- [Abp 源码分析]十一、权限验证
0.简介 Abp 本身集成了一套权限验证体系,通过 ASP.NET Core 的过滤器与 Castle 的拦截器进行拦截请求,并进行权限验证.在 Abp 框架内部,权限分为两块,一个是功能(Featu ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- ABP源码分析十九:Auditing
审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作. AuditInfo:定义如下图中需要被Audit的信息. Aud ...
- ABP源码分析二十九:ABP.MongoDb
这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类,封装了对MongoDb数据库的操作. 这个module通过引用MongoDB.Driver, ...
- ABP源码分析三十九:ABP.Hangfire
ABP对HangFire的集成主要是通过实现IBackgroundJobManager接口的HangfireBackgroundJobManager类完成的. HangfireBackgroundJo ...
- [Abp 源码分析]零、文章目录
0.系列文章目录 一.Abp 框架启动流程分析 二.模块系统 三.依赖注入 四.模块配置 五.系统设置 六.工作单元的实现 七.仓储与 Entity Framework Core 八.缓存管理 九.事 ...
随机推荐
- 干货来袭-整套完整安全的API接口解决方案
在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...
- android自定义控件一站式入门
自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...
- Centos——安装JDK
写在前面: Just mark! 创建linux虚拟机的时候经常要安装JDK,配置环境变量,却又经常忘记,这里记录一下. 环境:Centos-6.8-x86_64-minimal JDK :jdk-7 ...
- Js 原型和原型链
Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...
- 基于RN开发的一款视频配音APP(开源)
在如今React.ng.vue三分天下的格局下,不得不让自己加快学习的脚步.虽然经常会陷入各种迷茫,学得越多会发现不会的东西也被无限放大,不过能用新的技术作出一些小项目小Demo还是会给自己些许自信与 ...
- ABP文档翻译--值对象
本人是ABP初学者,在看英文文档和@tkb至简 的ABP框架理论研究总结(典藏版)时,发现大神@tkb至简中少了对Value Objects的翻译,看文档是新的,大神没时间把,小弟给补充上. 介绍 值 ...
- 图解CSS3制作圆环形进度条的实例教程
圆环形进度条制作的基本思想还是画出基本的弧线图形,然后CSS3中我们可以控制其旋转来串联基本图形,制造出部分消失的效果,下面就来带大家学习图解CSS3制作圆环形进度条的实例教程 首先,当有人说你能不能 ...
- 我的屌丝giser成长记-工作篇之B公司
从A公司跳槽到B公司,岗位还是webgis开发方向,但是具体实现的技术完全变了,从flex转换js,这也是我要离开A公司的最重要的原意之一:A公司的arcgis for flex框架采用了flexvi ...
- 敏捷转型历程 - Sprint3 Planning
我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...
- MongoDB学习笔记二—Shell操作
数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...