1. 程式人生 > >ABP原始碼分析九:後臺工作任務

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的解決思路是在執行真正的業務方法之前,通過將timerduetime設為無限大,從而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(可以自定義實現從資料庫中讀取)取最多1000BackgroundJobInfo,然後反射執行BackgroundJobInfo中定義的任務。

下面是一個ABP中通過BackgroundJobManager安排BackgroundJob的例子。

相關推薦

ABP原始碼分析後臺工作任務

文主要說明ABP中後臺工作者模組(BackgroundWorker)的實現方式,和後臺工作模組(BackgroundJob)。ABP通過BackgroundWorkerManager來管理BackgroundJobManager,然後通過BackgroundJobManager來管理BackgroundJob

ABP原始碼分析ABP Module

Abp是一種基於模組化設計的思想構建的。開發人員可以將自定義的功能以模組(module)的形式整合到ABP中。具體的功能都可以設計成一個單獨的Module。Abp底層框架提供便捷的方法整合每個Module.下圖是所有Abp自帶的module.AbpModule是所有Module的基類,其已經擁有了IIocMa

ABP原始碼分析整體專案結構及目錄

ABP是一套非常優秀的web應用程式架構,適合用來搭建集中式架構的web應用程式。 整個Abp的Infrastructure是以Abp這個package為核心模組(core)+15個模組(module).其中13個依賴於Abp這個核心包。另外兩個包(FluentMigration,Web.Resources

ABP原始碼分析ABP初始化全過程

ABP在初始化階段做了哪些操作,前面的四篇文章大致描述了一下。 為個更清楚的描述其脈絡,做了張流程圖以輔助說明。其中每一步都涉及很多細節,難以在一張圖中全部表現出來。每一步的細節(會涉及到較多介面,類,呼叫關係,步驟流程什麼的)會在後面的文章中通過其他圖和文字詳細描述。其實如果仔細分析Abp原始碼的話,會發現

ABP原始碼分析十三快取Cache實現

ABP中有兩種cache的實現方式:MemroyCache 和 RedisCache. 如下圖,兩者都繼承至ICache介面(準確說是CacheBase抽象類)。ABP核心模組封裝了MemroyCache 來實現ABP中的預設快取功能。 Abp.RedisCache這個模組封裝RedisCache來實現快取(

ABP原始碼分析Logger整合

ABP使用Castle日誌記錄工具,並且可以使用不同的日誌類庫,比如:Log4Net, NLog, Serilog... 等等。對於所有的日誌類庫,Castle提供了一個通用的介面來實現,我們可以很方便的處理各種特殊的日誌庫,而且當業務需要的時候,很容易替換日誌元件。 Logger功能模組涉及到的介面和類不

ABP原始碼分析Configuration

核心模組的配置 Configuration是ABP中設計比較巧妙的地方。其通過AbpStartupConfiguration,Castle的依賴注入,Dictionary物件和擴充套件方法很巧妙的實現了配置中心化。配置中心化是一個支援模組開發的框架必備功能。 ABP中核心功能模組中的一些功能的執行時的

ABP原始碼分析ABP中配置的註冊和初始化

一般來說,ASP.NET Web應用程式的第一個執行的方法是Global.asax下定義的Start方法。執行這個方法前HttpApplication 例項必須存在,也就是說其建構函式的執行必然是完成了。 ABP開始的地方就是HttpApplication的建構函式。 如下圖一,Abp定義了一個繼承自Http

ABP原始碼分析依賴注入的實現

ABP的依賴注入的實現有一個本質兩個途徑:1.本質上是依賴於Castle這個老牌依賴注入的框架。2.一種實現途徑是通過實現IConventionalDependencyRegistrar的例項定義注入的約定(規則),然後通過IocManager來讀取這個規則完成依賴注入。3另一種實現途徑是直接IocManag

ABP原始碼分析Setting 以及 Mail

本文主要說明Setting的實現以及Mail這個功能模組如何使用Setting. 首先區分一下ABP中的Setting和Configuration。 Setting一般用於需要通過外部配置檔案(或資料庫)設定的簡單型別資料(一般就是字串),比如SMTP HOST. Configuration一般

ABP原始碼分析Unit Of Work

ABP以AOP的方式實現UnitOfWork功能。通過UnitOfWorkRegistrar將UnitOfWorkInterceptor在某個類被註冊到IOCContainner的時候,一併新增到該類在容器中對應的ComponentModel的Interceptors集合中。總結一句話就是,UOW的功能是通過

ABP原始碼分析二十ABP.MongoDb

這個Module通過建立一個MongoDbRepositoryBase<TEntity> 基類,封裝了對MongoDb資料庫的操作。 這個module通過引用MongoDB.Driver,MongoDB.Bson,MongoDB.Driver.Core,MongoDB.Driver.Legacy類

ABP原始碼分析Auditing

審計跟蹤(也叫審計日誌)是與安全相關的按照時間順序的記錄,它們提供了活動序列的文件證據,這些活動序列可以在任何時間影響一個特定的操作。 AuditInfo:定義如下圖中需要被Audit的資訊。 AuditedAttribute: 用於標識一個方法或一個類的所有方法都需要啟用Auditing功能

ABP原始碼分析三十ABP.Hangfire

ABP對HangFire的整合主要是通過實現IBackgroundJobManager介面的HangfireBackgroundJobManager類完成的。 HangfireBackgroundJobManager:實現了介面IBackgroundJobManager中的方法EnqueueAsync,通過

[Abp 原始碼分析]十六、後臺作業與後臺工作者

0. 簡介 在某些時候我們可能會需要執行後臺任務,或者是執行一些週期性的任務。比如說可能每隔 1 個小時要清除某個臨時資料夾內的資料,可能使用者會要針對某一個使用者群來群發一組簡訊。前面這些就是典型的應用場景,在 Abp 框架裡面為我們準備了後臺作業和後臺工作者來幫助我們解決這個問題。 後臺作業與後臺工作者的

ABP原始碼分析十四Entity的設計

IEntity<TPrimaryKey>: 封裝了PrimaryKey:Id,這是一個泛型型別 IEntity: 封裝了PrimaryKey:Id,這是一個int型別 Entity<TPrimaryKey> :支援主鍵是泛型型別的Entity Entity:支援主鍵是int型別的

ABP原始碼分析四十三ZERO的本地化

ABP Zero模組擴充套件了ABP基礎框架中的本地化功能,實現了通過資料庫管理本地化的功能。其通過資料庫儲存本地化語言及其資源。 ApplicationLanguage:代表本地化語言的實體類。一種語言就是一個ApplicationLanguage例項。 ApplicationLanguag

ABP原始碼分析四十二ZERO的身份認證

ABP Zero模組通過自定義實現Asp.Net Identity完成身份認證功能, 對Asp.Net Identity做了較大幅度的擴充套件。同時重寫了ABP核心模組中的permission功能,以實現授權。注意:ABP僅僅使用了Asp.Net Identity的身份認證功能,但沒有使用Asp.Net Id

ABP原始碼分析二十六核心框架中的一些其他功能

本文是ABP核心專案原始碼分析的最後一篇,介紹一些前面遺漏的功能 AbpSession AbpSession: 目前這個和CLR的Session沒有什麼直接的聯絡。當然可以自定義的去實現IAbpSession使之與CLR的Session關聯 IAbpSession:定義如下圖中的四個屬性。 NullA

ABP原始碼分析二十ApplicationService

IApplicationService : 空介面,起標識作用。所有實現了IApplicationService 的類都會被自動注入到容器中。同時所有IApplicationService物件都會被注入一些攔截器(例如:auditing, UnitOfWork等)以實現AOP AbpServiceBase: