使用 .NET Core 和 Quartz.NET 实现任务调度持久化:更相信配置任务调度


Quartz.NET 持久化数据库后,如果你需要根据代码重新配置任务调度,而不是使用数据库中的现有配置,可以通过编程方式实现这一点。这通常涉及到以下几个步骤:

  • 移除现有的任务和触发器:在重新配置任务之前,移除数据库中现有的任务和触发器。
  • 通过代码重新添加任务和触发器:根据新的需求,通过代码添加新的任务和触发器。

以下是详细步骤和示例代码:

移除现有任务和触发器

在 Startup.cs 或者相应的初始化代码中,移除现有任务和触发器:

C# 全选
public async Task RemoveExistingJobs(IScheduler scheduler)
{
    var jobGroups = await scheduler.GetJobGroupNames();
    foreach (var group in jobGroups)
    {
        var jobKeys = await scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(group));
        foreach (var jobKey in jobKeys)
        {
            await scheduler.DeleteJob(jobKey);
        }
    }

    var triggerGroups = await scheduler.GetTriggerGroupNames();
    foreach (var group in triggerGroups)
    {
        var triggerKeys = await scheduler.GetTriggerKeys(GroupMatcher<TriggerKey>.GroupEquals(group));
        foreach (var triggerKey in triggerKeys)
        {
            await scheduler.UnscheduleJob(triggerKey);
        }
    }
}

通过代码重新添加任务和触发器

重新配置任务和触发器:

C# 全选
public async Task ConfigureJobs(IScheduler scheduler)
{
    // 示例任务和触发器配置
    var job = JobBuilder.Create<ExampleJob>()
                        .WithIdentity("job1", "group1")
                        .Build();

    var trigger = TriggerBuilder.Create()
                                .WithIdentity("trigger1", "group1")
                                .StartNow()
                                .WithSimpleSchedule(x => x
                                    .WithIntervalInSeconds(10)
                                    .RepeatForever())
                                .Build();

    await scheduler.ScheduleJob(job, trigger);
}

整合到 Startup.cs

在 Startup.cs 中,将上述方法整合到应用启动流程中:

C# 全选
public void ConfigureServices(IServiceCollection services)
{
    services.AddQuartz(q =>
    {
        q.UseMicrosoftDependencyInjectionJobFactory();

        q.UsePersistentStore(options =>
        {
            options.UseProperties = true;
            options.UseSqlServer(sqlServerOptions =>
            {
                sqlServerOptions.ConnectionString = Configuration["Quartz:dataSource.default.connectionString"];
                sqlServerOptions.TablePrefix = Configuration["Quartz:jobStore.tablePrefix"];
            });
        });
    });

    services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    var scheduler = app.ApplicationServices.GetService<ISchedulerFactory>().GetScheduler().Result;

    // 先移除现有任务和触发器
    RemoveExistingJobs(scheduler).Wait();

    // 然后按照代码重新配置任务和触发器
    ConfigureJobs(scheduler).Wait();
}

总结

以上步骤确保每次应用启动时,Quartz 都会清除现有任务和触发器,然后根据代码重新配置新的任务和触发器。这种方式确保任务调度的逻辑完全由代码控制,即使启用了持久化数据库。

注意事项

确保移除和添加任务的逻辑正确无误,以避免在应用运行期间出现不必要的调度中断。

在生产环境中,这种操作应谨慎处理,确保没有重要任务在移除过程中丢失。

 

 

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
张国生
上一篇:C#中的反射:获取类直接实现的接口并排除继承的上级接口
下一篇:Quartz.NET创建定时任务,触发器Cron表达式 配置参数解释
评论列表

发表评论

评论内容
昵称:
关联文章

使用 .NET Core Quartz.NET 实现任务调度持久相信配置任务调度
Quartz在.NET中的使用
在Vue 3项目中使用TypeScriptPinia进行持久状态管理初始化操作
Yarp 让系统内调度灵活
扫盲篇-什么是分布式任务调度
Quartz.NET创建定时任务,触发器Cron表达式 配置参数解释
.NET Core定时任务(控制台程序)
使用.NET 6开发TodoList应用(27)——实现API的Swagger文档
c# Quartzs定时器的简单使用
熔断降级的初步详解实现NET Core控制台输出讲解Polly)
使用.NET 6开发TodoList应用(30)——实现Docker打包部署
使用Hot Chocolate.NET 6构建GraphQL应用(3) —— 实现Query基础功能
使用.NET 6开发TodoList应用(31)——实现基于Github ActionsACI的CI/CD
.NET Core MVC 实现长时间任务的进度显示
.NET6中一些常用组件的配置使用记录,持续更新中。。。
使用.NET 6开发TodoList应用(26)——实现ConfigurationOption的强类型绑定
使用.NET 6开发TodoList应用(11)——使用FluentValidationMediatR实现接口请求验证
使用.NET 6开发TodoList应用(6)——使用MediatR实现POST请求
.NET Core 实现动态代理做AOP(面向切面编程)
使用Hot Chocolate.NET 6构建GraphQL应用(4) —— 实现Query映射功能

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码