如何使用asp.net core的quartz更改自动作业时间?

问题描述 投票:0回答:1

嗨,我尝试使用 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);
                    }
                }
            }
        }

    }

如何解决这个问题?请帮忙。

asp.net-core asp.net-core-mvc quartz.net
1个回答
0
投票

确保首次安排作业时名称为“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); }
如果不起作用,请启用方法日志记录,以查看方法是否按预期命中。

© www.soinside.com 2019 - 2024. All rights reserved.