public async void Post([FromBody] Services.Notification.NotificationSchedule value) { Logger.LogInformation($"Post Trigger for {value.SubscriberID} - {value.NotificationType}"); try { var triggerCreator = new TriggerCreator(Scheduler); var trigger = await triggerCreator.FillTriggerAsync(value); await Scheduler.Standby(); await Scheduler.ScheduleJob(trigger); // created trigger is not started, so need to do that: if (value.Enable) { await Scheduler.ResumeTrigger(trigger.Key); } else { await Scheduler.PauseTrigger(trigger.Key); } } finally { await Scheduler.Start(); } }
public void TestTriggerCreatorNormal() { //var loggerMoq = new Mock<ILogger>(); var quartzMock = new Mock <IScheduler>(); //var logger = loggerMoq.Object; var quartz = quartzMock.Object; var triggerCreator = new TriggerCreator(quartz); var notificationSchedule = new NotificationSchedule { SubscriberID = "*****@*****.**", NotificationType = "notificationType", RunOnSunday = false, RunOnMonday = false, RunOnTuesday = false, RunOnWednesday = false, RunOnThursday = false, RunOnFriday = true, RunOnSaturday = false, RunOnHour = 23, RunOnMinute = 15 }; var trigger = triggerCreator.FillTriggerAsync(notificationSchedule); trigger.Wait(); var itrigger = trigger.Result; // trigger can only look into the future, so need to set up the dates based on today: var today = System.DateTime.Today; // find next thursday: var thursday = today.AddDays(System.DayOfWeek.Thursday - today.DayOfWeek); if (thursday < today) { thursday = thursday.AddDays(7); } var friday = thursday.AddDays(1); var fridayNextWeek = friday.AddDays(7); // thursday 23:22 var referenceDate1 = new System.DateTime(thursday.Year, thursday.Month, thursday.Day, 23, 22, 0); // expect next friday, 23:15 var expectDate1 = new System.DateTime(friday.Year, friday.Month, friday.Day, 23, 15, 0); // friday 23:22 var referenceDate2 = new System.DateTime(friday.Year, friday.Month, friday.Day, 23, 22, 0); // expect next week friday 23:15 var expectDate2 = new System.DateTime(fridayNextWeek.Year, fridayNextWeek.Month, fridayNextWeek.Day, 23, 15, 0); Assert.AreEqual("*****@*****.**", itrigger.Key.Name); Assert.AreEqual("notificationType", itrigger.JobKey.Name); Assert.AreEqual <System.DateTimeOffset>(new System.DateTimeOffset(expectDate1), itrigger.GetFireTimeAfter(new System.DateTimeOffset(referenceDate1)).Value); Assert.AreEqual <System.DateTimeOffset>(new System.DateTimeOffset(expectDate2), itrigger.GetFireTimeAfter(new System.DateTimeOffset(referenceDate2)).Value); }
/// <summary> /// Creates the trigger for the user/notification type if it does not exist yet /// </summary> /// <param name="context"></param> /// <returns></returns> private async Task CreateTriggerIfNotExists(ConsumeContext <NotificationEntryDTO> context) { // if not subscriber, no need to make a trigger if (string.IsNullOrEmpty(context.Message.SubscriptionID)) { return; } // check if a job / trigger exist for this combination, if not create a default one TriggerKey k = new(context.Message.SubscriptionID, context.Message.NotificationType); var trigger = await Scheduler.GetTrigger(k); if (trigger == null) { var triggerCreator = new TriggerCreator(Scheduler); trigger = await triggerCreator.FillTriggerAsync(context.Message.SubscriptionID, context.Message.NotificationType); await Scheduler.ScheduleJob(trigger); } // if it exists, don't try to resume, as this will override the user's preference }