【转】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源码分析系列文章目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】ABP源码分析十:Unit Of Work

ABP以AOP的方式实现UnitOfWork功能。通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类在容器中对应的ComponentModel的Interceptors集合中。总结一句话就是,UOW的功能是通过自定义Castle拦截器来实现…

【转】ABP源码分析十一:Timing

Timing这个简单实用的功能主要用来以统一的方式表示时间。因为ABP中有大量的module,另外还支持自定义module,所以将时间统一表示为local时间(默认)或utc时间是必要的。 IClockProvider:提供获取当前时间和标准化时间的接口。 UtcClockProvide…

【转】ABP源码分析十二:本地化

本文逐个分析ABP中涉及到localization的接口和类,以及他们之间的关系。本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单。另一个是语言对应得本地化资源(Localization)的管理…

【转】ABP源码分析十三:缓存Cache实现

ABP中有两种cache的实现方式:MemoryCache 和 RedisCache. 如下图,两者都继承自ICache接口(准确说是CacheBase抽象类)。ABP核心模块封装了MemoryCache 来实现ABP中的默认缓存功能。 Abp.RedisCache这个模块封装RedisCache来实现缓存…

java 酒店预定 app_Android应用源码酒店在线预定app项目全套

【实例简介】Android应用源码酒店在线预定app项目全套【实例截图】【核心代码】package com.bn.summer;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;…

【转】ABP源码分析十四:Entity的设计

IEntity<TPrimaryKey>: 封装了PrimaryKey&#xff1a;Id,这是一个泛型类型 IEntity: 封装了PrimaryKey&#xff1a;Id,这是一个int类型 Entity<TPrimaryKey> &#xff1a;支持主键是泛型类型的Entity Entity&#xff1a;支持主键是int类型的Entity IHasCreation…

【转】ABP源码分析十六:DTO的设计

IDTO:空接口&#xff0c;用于标注Dto对象。 ComboboxItemDto&#xff1a;用于combobox/list中Item的DTO NameValueDto<T>/NameValueDto:用于name value键值对的DTO&#xff0c; name为string类型&#xff0c; value为泛型或string类型。 Entity Dto IEntityDto<TPri…

php session 机制,Cookie、Session机制详解及PHP中Session处理

会话机制Cookie/Session&#xff1a;在web应用中&#xff0c;常用的会话追踪机制是Cookie和Session。而Cookie是通过在浏览器里记录确定用户身份&#xff0c;Session在服务器端记录信息确定用户身份。Http协议&#xff1a;http协议本身是无状态的&#xff0c;也就是说我们无法通…

【转】ABP源码分析十七:DTO 自动校验的实现

对传给Application service对象中的方法的DTO参数&#xff0c;ABP都会在方法真正执行前自动完成validation&#xff08;根据标注到DTO对象中的validate规则&#xff09;。 ABP是如何做到的? 思路无外乎通过Castle的拦截器实现AOP。本文主要分析ABP是如何设计。 Ivalidate: 空…

【转】ABP源码分析十八:UI Inputs

以下图中描述的接口和类都在Abp项目的Runtime/Validation, UI/Inputs目录下的。在当前版本的ABP&#xff08;0.83&#xff09;中这些接口和类并没有实际使用到。阅读代码时可以忽略&#xff0c;无需浪费时间去寻找其是如何被ABP使用的(本文的目的)。 这些接口和类最终都是通过…

【转】ABP源码分析十九:Auditing

审计跟踪&#xff08;也叫审计日志&#xff09;是与安全相关的按照时间顺序的记录&#xff0c;它们提供了活动序列的文档证据&#xff0c;这些活动序列可以在任何时间影响一个特定的操作。 AuditInfo&#xff1a;定义如下图中需要被Audit的信息。 AuditedAttribute&#xff1a;…

【转】WebServices:WSDL的结构分析

WSDL&#xff08;Web Services Description Language&#xff0c;Web服务描述语言&#xff09;是为描述Web Services发布的XML格式。W3C组织没有批准1.1版的WSDL&#xff0c;但是2.0版本已经在製訂中&#xff0c;2.0版将被作为推荐标准&#xff08;recommendation&#xff09;&…

【转】WebService WSDL结构分析

转载自&#xff1a;http://kalogen.javaeye.com/blog/418958 WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application&#xff0c;他将Web服务描述定义为一组服务访问点&#xff0c;客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服…

【转】WebService 之 WSDL文件 讲解

恩&#xff0c;我想说的是&#xff0c;是不是经常有人在开发的时候&#xff0c;特别是和第三方有接口的时候&#xff0c;走的是SOAP协议&#xff0c;然后用户给你一个WSDL文件&#xff0c;说按照上面的进行适配&#xff0c;嘿嘿&#xff0c;这个时候&#xff0c;要是你以前没有…

集卡php源码,独角数卡自动发卡网PHP源码+教程:虚拟产品自助售卖

这款独角数卡自动发卡源码比大大目前在用的源码还要强大&#xff0c;测试了一下&#xff0c;不光可以零售还能批发&#xff0c;相当给力&#xff01;支付接口也是集成了很多&#xff0c;不仅支持支付宝当面付&#xff0c;还支持第三方的支付&#xff01;支付接口如下&#xff1…

思想已经高过行动好多了

好几天过去了&#xff0c;依然没什么起色&#xff0c;今天搜索一下论坛上自己的老帖&#xff0c;整理出来做个见证&#xff0c;看着自己才开始ASP的时候问的问题&#xff0c;不知所云。现在就不一样了&#xff0c;哈哈……在听了些微软的讲座之后&#xff0c;对设计模式很感兴趣…

【转】自旋锁-SpinLock(.NET 4.0+)

短时间锁定的情况下&#xff0c;自旋锁&#xff08;spinlock&#xff09;更快。&#xff08;因为自旋锁本质上不会让线程休眠&#xff0c;而是一直循环尝试对资源访问&#xff0c;直到可用。所以自旋锁线程被阻塞时&#xff0c;不进行线程上下文切换&#xff0c;而是空转等待。…

【转】.NET 自带的动态代理+Expression 实现AOP

下面代码&#xff08;摘抄之别处&#xff0c;原创在哪不知&#xff09;是采用TransparentProxy和RealProxy实现对象的动态代理。碍于其使用反射调用方法&#xff0c;所以就小试着将反射改成Expression以提高执行的效率。第15行就是原来代码中反射调用方法的关键代码。 1 using …

剖析Jive的缓存机制

剖析Jive的缓存机制- - 作者&#xff1a;张磊 本文选自&#xff1a;开放系统世界 2003年06月06日Jive是一个广受欢迎的开放源码的论坛项目&#xff0c;虽然推出了很多年&#xff0c;但至今很多Java程序员还对它津津乐道。从框架结构上看&#xff0c;它采用了很多设计模式&#…

主题:的中间层框架 第一节

主题:<插件式>的中间层框架 时间:2004-12-31 15:00 主讲:D10.天地弦 2004-12-31 14:56:15 /:>D10.天地弦(185511468) 开始吧&#xff0c;我们 2004-12-31 14:57:22 /:>D10.天地弦(185511468) 请大家先看图 http://www.jqk.net.cn/dkFrameworkWeb/dkFramework_fi…