星期四, 12月 28, 2023

[.NET] 在 BackgroundService 內使用 Quartz

在 BackgroundService 內使用 Quartz 3.8 來處理排程需求,Quartz 相關請參考之前筆記

安裝 Quartz 套件

必須安裝兩個套件

建立 Quartz Job

把 Log DI 注入後,使用 LogWarming 在畫面上輸出文字
using Quartz;

namespace QuartzWorkerSample
{
    [DisallowConcurrentExecution]
    public class HelloWorldJob : IJob
    {
        private readonly ILogger<HelloWorldJob> _logger;
        public HelloWorldJob(ILogger<HelloWorldJob> logger)
        {
            _logger = logger;
        }

        public Task Execute(IJobExecutionContext context)
        {
            _logger.LogWarning($"Hello World {DateTime.Now} and Jobtype: {context.JobDetail.JobType}");
            return Task.CompletedTask;
        }
    }
}  

在 Program 中使用 Quartz 

會有兩個文字輸出,分別為
  • QuartzHostedService:每 5 秒輸出
  • BackgroundService:即為 .NET 8 預設 Worker,每 1 秒輸出
QuartzHostedService 有實作 IHostService,可以變成背景服務來使用
C# 語法
using Quartz;

namespace QuartzWorkerSample
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = Host.CreateApplicationBuilder(args);

            builder.Services.AddQuartz(config =>
            {
                config.AddJob<HelloWorldJob>(config => config
                    .WithIdentity(nameof(HelloWorldJob)));

                config.AddTrigger(config => config
                    .ForJob(nameof(HelloWorldJob))
                    .WithIdentity("HelloWorldJob-Trigger")
                    .WithSimpleSchedule(x => x
                        .WithIntervalInSeconds(5) // 每五秒觸發一次
                        .RepeatForever()));
            });

            // QuartzHostedService 實作 IHostService
            builder.Services.AddQuartzHostedService(options => options
                .WaitForJobsToComplete = true);

            // 該 Worker 為 .NET 8 預設範本
            builder.Services.AddHostedService<Worker>();

            var host = builder.Build();
            host.Run();
        }
    }
}
執行結果
網路教學常見語法
builder.Services.AddQuartz(config =>
{
    config.UseMicrosoftDependencyInjectionScopedJobFactory();
    config.UseMicrosoftDependencyInjectionJobFactory();
});
UseMicrosoftDependencyInjectionScopedJobFactory 在 V3.3.2 開始 Job Factory 為 Scoped Jobs,不在需要使用它,詳見官方文章 - Microsoft DI Integration
UseMicrosoftDependencyInjectionJobFactory 在 V3.7 時 MS DI 變成預設 DI,不需要去設定,詳見 V3.7 release討論

看到這兩個語法就把它 pass 掉吧

沒有留言:

張貼留言