嗨,我尝试使用 asp.net core MVC(.net 7) 创建网站。我想自动从我的数据库获取备份。为此,我使用石英,当我每 5 分钟对 Crone Expression 进行一次硬编码时,一切工作正常。但我想动态地改变它。因此,我在管理员视图中创建下拉列表,该列表可以在每小时、每周和每月之间更改。代码已运行,但作业时间未更改。为了对此进行测试,我在更改完成后每 10 秒使用一次 crone。代码没有显示错误,但时间没有更改为 10 秒。如何解决这个问题? 这是我在program.cs文件中用于配置quartz的代码:
builder.Services.AddSingleton<IJobFactory, SingletonJobFactory>();
builder.Services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
builder.Services.AddSingleton<IScheduler>(provider =>
{
var schedulerFactory = new StdSchedulerFactory();
return schedulerFactory.GetScheduler().Result;
});
builder.Services.AddSingleton<BackUpdatabase>();
builder.Services.AddSingleton(new Jobschedule(jobType: typeof(BackUpdatabase), cronExpression:
"* 0./5 * * * ?"));
builder.Services.AddHostedService<QuartzHostService>();
这是我更改时间的控制器:
public class SettingMenuController : Controller
{
private readonly IScheduler _scheduler;
public SettingMenuController( IScheduler scheduler)
{
_scheduler = scheduler;
}
public IActionResult Index(string? message = null)
{
if (!string.IsNullOrEmpty(message))
{
ViewBag.message = message;
}
return View("SettingMenu", refreshSettingPage());
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> changeAutoTime(int cron)
{
//if (cron == 0) //day
//{
// await UpdateJobSchedule("0 0 0 * * ?");
//}
//else if (cron == 1) //week
//{
// await UpdateJobSchedule("0 0 0 ? * MON");
//}
//else if (cron == 2) //month
//{
// await UpdateJobSchedule("0 0 12 1 1/1 ? *");
//}
//else
//{
// await UpdateJobSchedule("0 0 0 * * ?");
//}
await UpdateJobSchedule("0/10 * * * * ?");
return RedirectToAction("Index", new { message = "time is change" });
}
private async Task UpdateJobSchedule(string cronExpression)
{
var jobKey = new JobKey("BackUpdatabase"); // Specify the job name as "BackUpdatabase"
var defaultGroup = "DEFAULT"; // Use the default group for triggers if not explicitly specified
var jobDetail = await _scheduler.GetJobDetail(jobKey);
if (jobDetail != null)
{
var triggerKeys = await _scheduler.GetTriggerKeys(GroupMatcher<TriggerKey>.GroupEquals(defaultGroup));
foreach (var triggerKey in triggerKeys)
{
// Loop through all triggers associated with the job and update their schedule
var trigger = await _scheduler.GetTrigger(triggerKey);
if (trigger != null && trigger.JobKey.Equals(jobKey))
{
var newTrigger = TriggerBuilder.Create()
.WithIdentity(triggerKey)
.WithSchedule(CronScheduleBuilder.CronSchedule(cronExpression))
.Build();
await _scheduler.RescheduleJob(triggerKey, newTrigger);
}
}
}
}
}
如何解决这个问题?请帮忙。
确保首次安排作业时名称为“BackUpdatabase”。
var jobKey = new JobKey("BackUpdatabase");
检查项目中安装的
Quartz
和 Quartz.Extensions.Hosting
NuGet 包。
在您的
QuartzHostService
或您第一次安排作业的任何地方,请确保您设置了“作业密钥:”
JobBuilder.Create<BackUpdatabase>()
.WithIdentity("BackUpdatabase")
.Build();
这是 UpdateJobSchedule 方法的更新代码,这将帮助您删除与作业关联的旧触发器并添加新触发器。
private async Task UpdateJobSchedule(string cronExpression)
{
var jobKey = new JobKey("BackUpdatabase");
var triggerKey = new TriggerKey("BackupTrigger");
var jobDetail = await _scheduler.GetJobDetail(jobKey);
if (jobDetail != null)
{
var existingTriggers = await _scheduler.GetTriggersOfJob(jobKey);
foreach (var trigger in existingTriggers)
{
await _scheduler.UnscheduleJob(trigger.Key);
}
var newTrigger = TriggerBuilder.Create()
.WithIdentity(triggerKey)
.ForJob(jobKey)
.WithCronSchedule(cronExpression)
.Build();
await _scheduler.ScheduleJob(newTrigger);
}
如果不起作用,请启用方法日志记录,以查看方法是否按预期命中。