.Net/.NetCore開發愛好者交流羣:1092236120
一、需求場景
我們在日常開發中,總會遇到這樣的需求:
- 每隔一段時間,執行一次某個任務。
- 固定某個時間執行任務,例如凌晨12點對當天的數據進行統計。
- 每個月的第幾天,執行某個任務。
諸如此類的需求很多,我們總不能人工去幹這件事吧 ?所以我們需要引入作業調度工具,也就是今天的主角——Quartz。
二、Quartz基本介紹
2.1Quartz概述
Quartz 是 OpenSymphony 開源組織在任務調度領域的一個開源項目,完全基於 Java 實現。該項目於 2009 年被 Terracotta 收購,目前是 Terracotta 旗下的一個項目。讀者可以到 http://www.quartz-scheduler.org/站點下載 Quartz 的發佈版本及其源代碼。
2.2Quartz的特點
作爲一個優秀的開源調度框架,Quartz 具有以下特點:
- 強大的調度功能,例如支持豐富多樣的調度方法,可以滿足各種常規及特殊需求;
- 靈活的應用方式,例如支持任務和調度的多種組合方式,支持調度數據的多種存儲方式;
- 分佈式和集羣能力,Terracotta 收購後在原來功能基礎上作了進一步提升。
三、使用Quartz
此次我將建立一個.net Core 3.1 MVC項目進行演示
1、NuGet引入Quartz,目前爲止Quartz的最新版本爲3.0.7。
2、註冊ISchedulerFactory的實例。
切換至Startup類,在ConfigureServices方法中添加如下代碼
services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
3、創建作業
我們添加一個Jobs的類,繼承Ijob接口
Jobs類中的Execute方法,多線程的向我們的D盤中的message.log文本文件中寫入當前時間。
3.代碼演示。
切換到HomeController ,正式開始擼代碼。
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly ISchedulerFactory _schedulerFactory;
private IScheduler _scheduler;
public HomeController(ILogger<HomeController> logger, ISchedulerFactory schedulerFactory)
{
_logger = logger;
_schedulerFactory = schedulerFactory;
}
public async Task<IActionResult> Index()
{
//通過工場類獲得調度器
_scheduler = await _schedulerFactory.GetScheduler();
//開啓調度器
await _scheduler.Start();
//創建觸發器(也叫時間策略)
var trigger = TriggerBuilder.Create()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever())//每10秒執行一次
.Build();
//創建作業實例
//Jobs即我們需要執行的作業
var jobDetail = JobBuilder.Create<Jobs>()
.WithIdentity("Myjob", "group")//我們給這個作業取了個“Myjob”的名字,並取了個組名爲“group”
.Build();
//將觸發器和作業任務綁定到調度器中
await _scheduler.ScheduleJob(jobDetail, trigger);
return View();
}
public IActionResult Privacy()
{
return View();
}
4、運行結果
可以看到程序每隔10秒就會向message文件寫入一行當前時間。
四、更多時間策略
文章開篇我們就列舉了幾種常見的業務需求,上面的案例中,我們演示了10秒鐘執行一次的效果。如果需要以分鐘、小時、天等作爲單位,甚至是更爲複雜的時間策略,如何定製呢?