Tag: quartz.net

在所有Quartz .NET IInterruptableJob上触发中断

我正在使用Quartz调度程序,并尝试在关闭应用程序时关闭所有作业。 我有一个专业工作,做“保持”或“忙碌等待”,基本上直到它得到一个条件,它坐在那里耐心等待。 由于新的集成点,这项工作是新的。 该应用程序使用Topshelf作为服务运行,每当我们尝试关闭服务以升级它时,现在该作业正在运行,我们必须最终重新启动服务器以使其关闭。 无论如何,这里很奇怪,我有一个单一的jobtype,当我尝试使用作业FireInstanceId或JobKey在下面的代码段中触发中断时: _logger.InfoFormat(“{0} scheduler interrupting listener”, scheduler.SchedulerName); scheduler.Interrupt(ListenerKeys.Realtime); _logger.InfoFormat(“{0} scheduler shutting down”, scheduler.SchedulerName); scheduler.Shutdown(true); _logger.InfoFormat(“{0} scheduler shut down”, scheduler.SchedulerName); 我得到一个例外: Job’Listeners.Realtime’不能被中断,因为它没有实现Quartz.IInterruptableJob 人们会认为这是直截了当的。 但是,这是使用此作业键的唯一作业: ListenerJob : BaseJob, IInterruptableJob { // some other code referenced in ExecuteJob public void Interrupt() { _dequeuer.StopDequeing(); } } 我会说你是如何实现它的,所以我的问题变成了:Quartz中是否存在已知错误? 是否存在组密钥和中断的问题? 有没有办法告诉调度程序中断所有可中断的作业? 还有其他选择吗? UPDATE 我决定从以下答案运行以下代码以获得更多诊断。 var接口确实包含IInterruptableJob var jobs = […]

在Quartz.net中每次执行后,JobData都不会保留

我有一份工作,我想跟踪最近的50次跑步。 由于某种原因,似乎状态不是存储在我的简单原型中: [PersistJobDataAfterExecution] public class ApiJob : IJob { private const string JobRunsKey = “jobRuns”; private const int HistoryToKeep = 50; private const string UrlKey = “Url”; public void Execute(IJobExecutionContext context) { var jobDataMap = context.JobDetail.JobDataMap; var url = context.JobDetail.JobDataMap.GetString(UrlKey); var client = new RestClient(url); var request = new RestRequest(Method.POST); var response = client.Execute(request); var […]

Quartz.NET – 在Job完成完全执行后调用一个函数

我们使用Quartz.Net在Windows服务中按计划触发作业。 我有一种情况,我必须每5 minutes从Start DateTime到End DateTime触发一个工作。 作业完成后,我们需要计算Next Start DateTime和Next End DateTime并保存到DB – 为此,我试图覆盖JobListener ,它有一个方法: JobWasExecuted public class xPTJobListener : JobListenerSupport { public override string Name { get { return “xPTJobListener”; } } public override void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException) { var dataMap = context.MergedJobDataMap; var schedule = (MyDTO)dataMap[“Schedule”]; using (var logger = new xPTLogger()) { logger.LogMessage(MessageType.Information, […]

使用Quartz .NET创建Cron表达式

是否可以使用Quartz .NET程序集生成cron表达式? 我看到CronScheduleBuilder类有一个私有成员cronExpression ,这基本上就是我要找的东西。 有没有其他方法可以获得cron表达式?

我怎样才能在每两周的星期一和星期二运行石英计划?

我使用以下方式在星期一每两周运行一次计划。 ITrigger trigger = TriggerBuilder.Create() .StartAt(DateBuilder.DateOf(StartHour, StartMinute, StartSeconds, StartDate, StartMonth, StartYear)) .WithCalendarIntervalSchedule(x => x.WithIntervalInWeeks(Int32.Parse(nWeekInterval))) .EndAt(DateBuilder.DateOf(0, 0, 0, EndDay, EndMonth, EndYear)) .Build(); 但是我如何使用单一的时间表在星期一和星期二运行。 请指教。

Quartz.net中’DisallowConcurrentExecution’的含义是什么?

我有一个Quartz.net Job,其定义如下。 [PersistJobDataAfterExecution] [DisallowConcurrentExecution] public class AdItemsJob : IJob, IInterruptableJob { public void Execute(IJobExecutionContext context) { // Job execution logic, } } 因为我用DisallowConcurrentExecution属性装饰了Job。 我对这个属性的了解,我们不能同时运行同一个作业的多个实例。 多个实例的含义是什么? 具有不同键的AddItemsJob的两个作业是否被称为相同的实例或不同的实例。 具有不同密钥的两个作业是否可以同时执行。

Quartz.net并不总是有效

我正在使用Quartz.net库的简单调度程序。 我有7种不同的触发器。 顺序是这样的。 第一:每120分钟一次。 第二:每12个小时。 第三:每5分钟一次。 第四:每3分钟一次。 第五:每29秒。 第六:每10秒。 第七:每5秒一次。 你看到它有点复杂。 我有这样的问题。 First Trigger需要每两个小时工作一次。 但经过几次运行后,它会自行停止。 它根本不起作用。 其他人都在工作,他们没事。 我很抱歉我的英语不好。 private int bultengetir = 120; // min private int baslayanmacsil = 29; //sec private int kuponsonuclandir = 5;//5 min private int canliorangetir = 10; //sec private int canlimacgetir = 7; //sec private int canlimacsil = 12;//hour private […]

Windows服务中的Quartz Job Scheduler

我有这个Windows服务项目的OnStart方法看起来像这样 protect void OnStart(string[] args) { IScheduler someScheduler = _schedFactory.GetScheduler(); // _schedFactory is a priva field of the service class IJobDetail someJob = JobBuilder.Create() .WithIdentity(“SomeJob”) .Build(); ITrigger someTrigger = TriggerBuilder.Create() .StartAt(new DateTimeOffset(DateTime.UtcNow.AddSeconds(30))) .WithSimpleSchedule(schedule => scheduler.WithIntervalInMinutes(3).RepeatForever()) .Build(); someScheduler.SchedulerJob(someJob, someTrigger); someScheduler.Start(); } 我使用Visual Studio Developer命令提示符来安装该服务。 该命令是installutil.exe 。 现在当安装服务时,我去任务管理器并启动它。 在OnStart方法的顶部有Thread.Sleep(10000) ,所以我可以设法使用调试器附加到服务。 因此,当它附加时,我会通过代码,没有什么特别的事情发生,我的意思是没有exception发生。 我甚至看到应该执行工作的时间和正确的时间。 当我坐在调试模式并等待作业的Execute方法执行时,它没有。 我的意思是,到时候,visual studio正在加载符号,但作业本身并没有被执行。 可能是什么问题? 还有一件事我在这个OnStart方法中创建了两个作业。 […]

可以重新使用JobDetail记录吗?

有没有办法在JobDetail记录上创建一个新的触发器,该记录在数据库中,但不在内存中? 具体用途:我计划每天使用cron触发器运行作业。 有时需要使用相同的参数重新运行特定日期的工作。 我想使用相同的JobDetail创建一个新的简单触发器,因为这是存储参数的地方。 Reschedule()不起作用,因为它删除了现有的触发器。 那可能吗?

使用SQL Server AdoJobStore配置Quartz.NET

我在尝试让Quartz.NET与AdoJobStore一起工作时遇到了麻烦。 这里没有其他问题似乎遇到了我的问题。 我能够在没有AdoJobStore配置的情况下使其工作正常,但是最终会保留所有内容,但是在尝试GetScheduler()时我得到了一个我无法弄清楚的错误。 这是我的quartz app.config部分: 这是相关的初始化代码: var config = (NameValueCollection) ConfigurationManager.GetSection(“quartz”); ISchedulerFactory factory = new StdSchedulerFactory(config); // This is where an ArgumentOutOfRange exception occurs: IScheduler scheduler = factory.GetScheduler(); 我得到的错误是ArgumentOutOfRangeException : 长度不能小于零。\ r \ n参数名称:长度 单步执行代码,我可以validation配置部分是否正确读取,并且我检查拼写错误和配置属性的大写错误。 我已经validation了可以使用我拥有的connectionString访问数据库。 在通过代码并在立即窗口中检查工厂变量时我注意到的一件事是它总是说“AllSchedulers:Count = 0” – 不确定是否因为我还没有实例化一个或者如果那是我的问题。 试图从配置中为GetScheduler() instanceName – factory.GetScheduler(“XxxDefaultQuartzScheduler”) 也不起作用。 我错过了什么/做错了什么? 请指教。