使用 .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开发框架网发布内容,转载请附上原文出处连接
post 张国生