How I add schedule to running window service in Quartz.net?

Viewed 31

I have UI program. Workflow is

  1. Click the button to install and start window service
  2. When window service is running, I click 'Add Schedule' button to add schedule to quartz
  3. If window service is started or stopped then quartz is also started or stoped

I writed code like below. But it's not working.(_scheduler is null when call AddSchedule method in ServiceManager class)

namespace CodeSamples
{
    class ServiceManager : ServiceBase
    {
        private static StdSchedulerFactory _factory;
        private static IScheduler _scheduler;
        private static readonly string _groupName = "Test";

        static ServiceManager()
        {
        }
        
        protected override async void Start(string[] args)
        {
            NameValueCollection properties = new NameValueCollection
            {
                ["quartz.jobStore.misfireThreshold"] = "5000", // 5 sec
                ["quartz.jobStore.type"] = "Quartz.Simpl.RAMJobStore"
            };

            _factory = new StdSchedulerFactory(properties);
            _scheduler = await _factory.GetScheduler();
            await _scheduler.Start();
        }

        protected override void Stop()
        {
            await _scheduler.Shutdown(false);
        }

        // Called from form class like 
        // CodeSamples.ServiceManager.AddSchedule<TestQuartz_1>("TEST");
        public static async void AddSchedule<T>(string name) where T : IJob
        {
            IJobDetail job = JobBuilder.Create<T>()
                .WithIdentity(name, _groupName)
                .Build();

            ITrigger trigger = TriggerBuilder.Create()
                        .WithIdentity($"trg_{name}", _groupName)
                        .StartNow()
                        .WithSimpleSchedule(s => s
                            .WithIntervalInSeconds(1)
                            .RepeatForever()
                            .WithMisfireHandlingInstructionIgnoreMisfires())
                        .Build();

            // _scheduler is null when  btnAddSchedule_Click event
            await _scheduler.ScheduleJob(job, trigger); 
        }
    }
}
0 Answers
Related