Example #1
0
        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);
        }
Example #3
0
        /// <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
        }