依然天下无双 發表於 2026-1-12 10:05:18

.NET Core使用Quartz的实现示例

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 安装 NuGet 包</a></li><li><a href="#_label1">2. 配置服务</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">.NET 6+ 使用 Minimal API:</a></li><li><a href="#_lab2_1_1">传统配置方式:</a></li></ul><li><a href="#_label2">3. 创建作业</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">4. 使用依赖注入的作业</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">5. 配置多个作业和触发器</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">6. 使用配置文件</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">7. 动态调度作业</a></li><ul class="second_class_ul"></ul><li><a href="#_label7">常用 Cron 表达式示例</a></li><ul class="second_class_ul"></ul></ul></div><p>在 .NET Core 中使用 Quartz.NET 可以分为以下几个主要步骤:</p>
<p class="maodian"><a name="_label0"></a></p><h2>1. 安装 NuGet 包</h2>
<div class="jb51code"><pre class="brush:csharp;">dotnet add package Quartz
dotnet add package Quartz.Extensions.Hosting
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>2. 配置服务</h2>
<p>在 <code>Program.cs</code> 或 <code>Startup.cs</code> 中配置 Quartz:</p>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>.NET 6+ 使用 Minimal API:</h3>
<div class="jb51code"><pre class="brush:csharp;">var builder = WebApplication.CreateBuilder(args);

// 添加 Quartz 服务
builder.Services.AddQuartz(q =&gt;
{
    // 可选:配置 Quartz 选项
    q.UseMicrosoftDependencyInjectionJobFactory();
   
    // 创建作业键
    var jobKey = new JobKey("HelloWorldJob");
   
    // 注册作业
    q.AddJob&lt;HelloWorldJob&gt;(opts =&gt; opts.WithIdentity(jobKey));
   
    // 创建触发器
    q.AddTrigger(opts =&gt; opts
      .ForJob(jobKey)
      .WithIdentity("HelloWorldJob-trigger")
      .WithCronSchedule("0/5 * * * * ?")); // 每5秒执行一次
});

// 添加 Quartz 托管服务
builder.Services.AddQuartzHostedService(q =&gt; q.WaitForJobsToComplete = true);

var app = builder.Build();
app.Run();
</pre></div>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>传统配置方式:</h3>
<div class="jb51code"><pre class="brush:csharp;">public void ConfigureServices(IServiceCollection services)
{
    services.AddQuartz(q =&gt;
    {
      q.UseMicrosoftDependencyInjectionJobFactory();
      
      var jobKey = new JobKey("HelloWorldJob");
      q.AddJob&lt;HelloWorldJob&gt;(opts =&gt; opts.WithIdentity(jobKey));
      
      q.AddTrigger(opts =&gt; opts
            .ForJob(jobKey)
            .WithIdentity("HelloWorldJob-trigger")
            .WithCronSchedule("0 0/5 * * * ?")); // 每5分钟执行一次
    });

    services.AddQuartzHostedService(q =&gt; q.WaitForJobsToComplete = true);
}
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 创建作业</h2>
<p>创建实现 <code>IJob</code> 接口的作业类:</p>
<div class="jb51code"><pre class="brush:csharp;">using Quartz;

public class HelloWorldJob : IJob
{
    private readonly ILogger&lt;HelloWorldJob&gt; _logger;

    public HelloWorldJob(ILogger&lt;HelloWorldJob&gt; logger)
    {
      _logger = logger;
    }

    public async Task Execute(IJobExecutionContext context)
    {
      _logger.LogInformation("HelloWorldJob 执行于: {Time}", DateTime.Now);
      
      // 你的业务逻辑
      await Task.Delay(1000);
      
      _logger.LogInformation("HelloWorldJob 完成于: {Time}", DateTime.Now);
    }
}
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 使用依赖注入的作业</h2>
<p>如果你的作业需要其他服务,可以通过构造函数注入:</p>
<div class="jb51code"><pre class="brush:csharp;">public class EmailJob : IJob
{
    private readonly IEmailService _emailService;
    private readonly ILogger&lt;EmailJob&gt; _logger;

    public EmailJob(IEmailService emailService, ILogger&lt;EmailJob&gt; logger)
    {
      _emailService = emailService;
      _logger = logger;
    }

    public async Task Execute(IJobExecutionContext context)
    {
      try
      {
            // 从 JobDataMap 获取参数
            var toEmail = context.JobDetail.JobDataMap.GetString("ToEmail");
            var subject = context.JobDetail.JobDataMap.GetString("Subject");
            
            await _emailService.SendAsync(toEmail, subject, "Hello from Quartz!");
            _logger.LogInformation("邮件发送成功");
      }
      catch (Exception ex)
      {
            _logger.LogError(ex, "邮件发送失败");
      }
    }
}
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>5. 配置多个作业和触发器</h2>
<div class="jb51code"><pre class="brush:csharp;">services.AddQuartz(q =&gt;
{
    // 作业1:每5分钟执行
    var jobKey1 = new JobKey("ReportJob");
    q.AddJob&lt;ReportJob&gt;(opts =&gt; opts.WithIdentity(jobKey1));
    q.AddTrigger(opts =&gt; opts
      .ForJob(jobKey1)
      .WithIdentity("ReportJob-trigger")
      .WithCronSchedule("0 0/5 * * * ?"));
   
    // 作业2:每天凌晨2点执行
    var jobKey2 = new JobKey("CleanupJob");
    q.AddJob&lt;CleanupJob&gt;(opts =&gt; opts.WithIdentity(jobKey2));
    q.AddTrigger(opts =&gt; opts
      .ForJob(jobKey2)
      .WithIdentity("CleanupJob-trigger")
      .WithCronSchedule("0 0 2 * * ?"));
   
    // 作业3:简单的间隔调度
    var jobKey3 = new JobKey("HealthCheckJob");
    q.AddJob&lt;HealthCheckJob&gt;(opts =&gt; opts.WithIdentity(jobKey3));
    q.AddTrigger(opts =&gt; opts
      .ForJob(jobKey3)
      .WithIdentity("HealthCheckJob-trigger")
      .StartNow()
      .WithSimpleSchedule(x =&gt; x
            .WithIntervalInSeconds(30)
            .RepeatForever()));
});
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>6. 使用配置文件</h2>
<p>在 <code>appsettings.json</code> 中配置:</p>
<div class="jb51code"><pre class="brush:json;">{
"Quartz": {
    "scheduler": {
      "instanceName": "MyScheduler"
    },
    "threadPool": {
      "type": "Quartz.Simpl.SimpleThreadPool, Quartz",
      "threadCount": 10
    },
    "jobStore": {
      "type": "Quartz.Simpl.RAMJobStore, Quartz"
    }
}
}
</pre></div>
<p class="maodian"><a name="_label6"></a></p><h2>7. 动态调度作业</h2>
<p>你也可以在运行时动态调度作业:</p>
<div class="jb51code"><pre class="brush:csharp;">public class JobSchedulerService
{
    private readonly ISchedulerFactory _schedulerFactory;

    public JobSchedulerService(ISchedulerFactory schedulerFactory)
    {
      _schedulerFactory = schedulerFactory;
    }

    public async Task ScheduleOneTimeJob&lt;T&gt;(DateTimeOffset startTime) where T : IJob
    {
      var scheduler = await _schedulerFactory.GetScheduler();
      
      var job = JobBuilder.Create&lt;T&gt;()
            .WithIdentity(Guid.NewGuid().ToString())
            .Build();
            
      var trigger = TriggerBuilder.Create()
            .WithIdentity(Guid.NewGuid().ToString())
            .StartAt(startTime)
            .Build();
            
      await scheduler.ScheduleJob(job, trigger);
    }
}
</pre></div>
<p class="maodian"><a name="_label7"></a></p><h2>常用 Cron 表达式示例</h2>
<ul><li><code>&quot;0 0/5 * * * ?&quot;</code> - 每5分钟</li><li><code>&quot;0 0 * * * ?&quot;</code> - 每小时</li><li><code>&quot;0 0 2 * * ?&quot;</code> - 每天凌晨2点</li><li><code>&quot;0 0 9 ? * MON-FRI&quot;</code> - 工作日早上9点</li><li><code>&quot;0 30 9 ? * MON&quot;</code> - 每周一早上9:30</li></ul>
<p>这样你就完成了在 .NET Core 中集成和使用 Quartz.NET 的基本配置。记得根据你的具体需求调整作业逻辑和调度策略。</p>
頁: [1]
查看完整版本: .NET Core使用Quartz的实现示例