.NET使用 Quartz.NET 动态生成多个任务的实现

科技   2024-11-24 08:18   北京  

在 C# 中使用 Quartz.NET 动态生成多个任务可以分为以下步骤进行:


1. 安装 Quartz.NET 包

首先,在你的项目中安装 Quartz.NET 包,可以通过以下方式完成:

  • 使用 NuGet 包管理器:搜索并安装 Quartz 包。
  • 使用命令行安装
    Install-Package Quartz

2. 创建 Job 类

创建一个继承自 IJob 接口的自定义 Job 类,并实现你想要执行的任务逻辑。

using Quartz;
using System;
using System.Threading.Tasks;

public class SampleJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        await Task.Run(() =>
        {
            // 这里放置你的任务逻辑
            Console.WriteLine("Executing job...");
        });
    }
}

3. 创建调度器和触发器

在代码中创建调度器(Scheduler)和触发器(Trigger)来配置和管理任务。

SchedulerManager 示例

using Quartz;
using Quartz.Impl;

public class SchedulerManager
{
    public static async Task Start()
    {
        // 获取调度器实例
        IScheduler scheduler = await new StdSchedulerFactory().GetScheduler();

        // 启动调度器
        await scheduler.Start();

        // 创建任务
        IJobDetail job = JobBuilder.Create<SampleJob>()
            .WithIdentity("job1""group1")
            .Build();

        // 创建触发器
        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("trigger1""group1")
            .StartNow()
            .WithSimpleSchedule(x => x
                .WithIntervalInSeconds(10// 每隔 10 秒执行一次
                .RepeatForever())         // 无限重复
            .Build();

        // 关联任务和触发器
        await scheduler.ScheduleJob(job, trigger);
    }
}

4. 动态生成多个任务

你可以在程序运行时动态生成多个任务。以下是完整示例:

Program 主方法

public class Program
{
    public static async Task Main(string[] args)
    {
        // 启动默认任务
        await SchedulerManager.Start();

        // 动态生成更多任务
        await SchedulerManager.CreateJob("job2""group2"5);  // 每隔 5 秒执行一次
        await SchedulerManager.CreateJob("job3""group3"10); // 每隔 10 秒执行一次
    }
}

在 SchedulerManager 中添加动态任务方法

SchedulerManager 中扩展一个方法,用于动态创建任务:

public static async Task CreateJob(string jobName, string jobGroup, int intervalInSeconds)
{
    IScheduler scheduler = await new StdSchedulerFactory().GetScheduler();

    IJobDetail job = JobBuilder.Create<SampleJob>()
        .WithIdentity(jobName, jobGroup)
        .Build();

    ITrigger trigger = TriggerBuilder.Create()
        .WithIdentity($"trigger_{jobName}", jobGroup)
        .StartNow()
        .WithSimpleSchedule(x => x
            .WithIntervalInSeconds(intervalInSeconds)
            .RepeatForever())
        .Build();

    await scheduler.ScheduleJob(job, trigger);
}

5. 注意事项

  1. 调度器的资源释放
    在程序关闭时,务必停止并释放调度器资源,确保任务正常结束。例如:

    await scheduler.Shutdown();
  2. 业务逻辑扩展
    在实际场景中,可能需要根据业务需求进一步调整任务的执行逻辑和触发器的配置。

  3. 日志管理
    使用日志记录任务的执行情况,以便更好地维护和排查问题。


通过以上步骤,你就可以在程序运行时动态生成多个任务并灵活管理它们。这种方式非常适合需要执行定时任务的应用场景,比如定期数据处理、自动化脚本执行等。

参考:leavescn.com/Articles/Content/1754


关注公众号DotNet开发跳槽    


DotNet开发跳槽
本公众号专注为.net开发工程师提供一个学习技术及求职/跳槽的交流平台。不定期分享NET技术类文章、面试题、求助技巧等干货,原创文章300+篇,让.net开发工程师学习/面试不再迷茫。ps: 后台回复“跳槽”,免费领取.NET开发面试题!
 最新文章