コード例 #1
0
        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now.ToString("r"));

            //1.首先创建一个作业调度池
            ISchedulerFactory schedf = new StdSchedulerFactory();
            IScheduler        sched  = schedf.GetScheduler();

            //2.创建出来一个具体的作业
            IJobDetail job = JobBuilder.Create <JobDemo>().Build();

            //NextGivenSecondDate:如果第一个参数为null则表名当前时间往后推迟2秒的时间点。
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            DateTimeOffset endTime   = DateBuilder.NextGivenSecondDate(DateTime.Now.AddHours(2), 3);



            //3.创建并配置一个触发器
            //ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(int.MaxValue)).Build();
            //ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
            //                                                                .WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(100))
            //                                                                .Build();
            ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
                                   .WithCronSchedule("1,10,14 10,20,25,26,33,54 * * * ? ")
                                   .Build();


            //4.加入作业调度池中
            sched.ScheduleJob(job, trigger);

            //5.开始运行
            sched.Start();
            Console.ReadKey();
            //Add some comments.
        }
コード例 #2
0
        /// <summary>
        /// 添加任务计划
        /// </summary>
        /// <returns></returns>
        private async Task AddScheduleJob(List <OpenJobEntity> entityList)
        {
            try
            {
                foreach (OpenJobEntity entity in entityList)
                {
                    entity.F_StarRunTime = DateTime.Now;
                    entity.F_EndRunTime  = DateTime.Now.AddSeconds(-1);
                    DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(entity.F_StarRunTime, 1);
                    DateTimeOffset endRunTime  = DateBuilder.NextGivenSecondDate(DateTime.MaxValue.AddDays(-1), 1);
                    await _service.SubmitForm(entity, entity.F_Id);

                    IJobDetail job = JobBuilder.Create <JobExecute>().WithIdentity(entity.F_JobName, entity.F_JobGroup).Build();
                    job.JobDataMap.Add("F_Id", entity.F_Id);

                    ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                           .StartAt(starRunTime)
                                           .EndAt(endRunTime)
                                           .WithIdentity(entity.F_JobName, entity.F_JobGroup)
                                           .WithCronSchedule(entity.F_CronExpress)
                                           .Build();
                    await _scheduler.ScheduleJob(job, trigger);
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteWithTime(ex);
            }
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: idotnet/QuartzDemo
        private static void CodeMethod()
        {
            Console.WriteLine(DateTime.Now.ToString());

            //1.首先创建一个作业调度池
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            var scheduler = schedulerFactory.GetScheduler();
            //2.创建出来一个具体的作业
            IJobDetail job = JobBuilder.Create <JobDemo>().Build();

            //3.创建并配置一个触发器
            #region 每隔5秒执行一次Execute方法,无休止
            //ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(int.MaxValue)).Build();
            #endregion

            #region  序每5秒执行一次,一共执行50次,开始执行时间设定在当前时间,结束时间我设定在1小时后,不管50次有没有执行完,1小时后,程序都不再继续执行
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            DateTimeOffset endTime   = DateBuilder.NextGivenSecondDate(DateTime.Now.AddHours(1), 5);
            //ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
            //                          .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(50))
            //                          .Build();
            #endregion

            #region 实现各种时间纬度的调用(使用cron-like):在每小时的第10,20,30分钟,每分钟的第11,27秒执行一次
            ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime).WithCronSchedule("11,27 10,20,30 * * * ? ").Build();
            #endregion

            //4.加入作业调度池中
            scheduler.ScheduleJob(job, trigger);
            //5.开始运行
            scheduler.Start();
            Console.ReadKey();
        }
コード例 #4
0
ファイル: ScheduleManager.cs プロジェクト: jclown/test
        public static async void CreateJobRepeat <T>(string cron, int repeatCount, Dictionary <string, object> keyValues = default, DateTimeOffset startAt = default) where T : IJob
        {
            var name  = NewToken();
            var group = NewToken();
            var job   = JobBuilder.Create <T>()
                        .WithIdentity(name, group)
                        .Build();

            if (keyValues != default)
            {
                foreach (var item in keyValues)
                {
                    job.JobDataMap[item.Key] = item.Value;
                }
            }

            if (startAt == null)
            {
                startAt = DateBuilder.NextGivenSecondDate(DateTime.Now, 1);
            }

            var cronTrigger = TriggerBuilder.Create()
                              .StartAt(startAt)
                              .WithIdentity(name + "Trigger", group + "Trigger")
                              .WithCronSchedule(cron)
                              .WithSchedule(SimpleScheduleBuilder.RepeatMinutelyForTotalCount(repeatCount))
                              .Build();

            await scheduler.ScheduleJob(job, cronTrigger);
        }
コード例 #5
0
        public static IScheduler GetSchedulers(IScheduler sched)
        {
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 10);

            UnityContainer container = new UnityContainer();

            container.RegisterType <ISiteBLL, SiteBLL>();

            //返回调用者
            ISiteBLL ISite = container.Resolve <SiteBLL>();

            List <JobSite> sites = ISite.getJobSites();

            _logger.InfoFormat("任务初始化共" + sites.Count + "个站点");

            foreach (JobSite s in sites)
            {
                IJobDetail job = JobBuilder.Create <GT.SiteCheck.Job.SiteCheckJob>().WithIdentity(s.site.name, s.node.nodeName).Build();

                ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
                                         .WithIdentity(s.site.name, s.node.nodeName)
                                         .StartAt(startTime)
                                         .WithSimpleSchedule(x => x.WithIntervalInSeconds(s.site.interval.Value).RepeatForever())                       //.WithRepeatCount(2)
                                         .Build();

                job.JobDataMap.Put(GT.SiteCheck.Job.SiteCheckJob.site, s.site);

                sched.ScheduleJob(job, trigger);
            }

            return(sched);
        }
コード例 #6
0
ファイル: InterruptExample.cs プロジェクト: zidad/quartznet
        public virtual void Run()
        {
            log.Info("------- Initializing ----------------------");

            // First we must get a reference to a scheduler
            ISchedulerFactory sf    = new StdSchedulerFactory();
            IScheduler        sched = sf.GetScheduler();

            log.Info("------- Initialization Complete -----------");

            log.Info("------- Scheduling Jobs -------------------");

            // get a "nice round" time a few seconds in the future...

            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 15);

            IJobDetail job = JobBuilder.Create <DumbInterruptableJob>()
                             .WithIdentity("interruptableJob1", "group1")
                             .Build();

            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
                                     .WithIdentity("trigger1", "group1")
                                     .StartAt(startTime)
                                     .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
                                     .Build();

            DateTimeOffset ft = sched.ScheduleJob(job, trigger);

            log.Info(string.Format("{0} will run at: {1} and repeat: {2} times, every {3} seconds", job.Key, ft.ToString("r"), trigger.RepeatCount, trigger.RepeatInterval.TotalSeconds));

            // start up the scheduler (jobs do not start to fire until
            // the scheduler has been started)
            sched.Start();
            log.Info("------- Started Scheduler -----------------");


            log.Info("------- Starting loop to interrupt job every 7 seconds ----------");
            for (int i = 0; i < 50; i++)
            {
                try
                {
                    Thread.Sleep(TimeSpan.FromSeconds(7));
                    // tell the scheduler to interrupt our job
                    sched.Interrupt(job.Key);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }

            log.Info("------- Shutting Down ---------------------");

            sched.Shutdown(true);

            log.Info("------- Shutdown Complete -----------------");
            SchedulerMetaData metaData = sched.GetMetaData();

            log.Info(string.Format("Executed {0} jobs.", metaData.NumberOfJobsExecuted));
        }
コード例 #7
0
ファイル: DataSyncService.cs プロジェクト: toorani/Neutrino
        private async Task AddCheckNotCompletedJobAsync <TServiceJobName>()
            where TServiceJobName : ServiceJob, new()
        {
            Dictionary <string, object> jobDataMap = new Dictionary <string, object>
            {
                ["jobCallTypes"] = JobCallTypes.CheckNotCompleted
            };
            IJobDetail job = JobBuilder.Create <TServiceJobName>()
                             .WithIdentity(typeof(TServiceJobName).Name + "_chk")
                             .Build();

            job.JobDataMap.PutAll(jobDataMap);
            var serviceJob = new TServiceJobName();

            DateTimeOffset startTime       = DateBuilder.NextGivenSecondDate(null, 5);
            var            schedulePattern = dataSyncConfiguration.SchedulePattern.CheckFailureMode;

            if (string.IsNullOrWhiteSpace(dataSyncConfiguration.Services[serviceJob.serviceName].AcquireSchedulePattern) == false)
            {
                schedulePattern = dataSyncConfiguration.Services[serviceJob.serviceName].AcquireSchedulePattern;
            }

            ITrigger trigger = TriggerBuilder.Create()
                               .WithIdentity("trigger_chk_" + typeof(TServiceJobName).Name + "_")
                               .StartAt(startTime)
                               .WithCronSchedule(dataSyncConfiguration.SchedulePattern.CheckFailureMode)
                               .ForJob(job)
                               .Build();

            await mainScheduler.ScheduleJob(job, trigger);
        }
コード例 #8
0
        async Task <bool> IJobCenter.AddScheduleJobAsync(JobCenterOptions options, Type jobType)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(options.StarRunTime, 1);

            DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(options.EndRunTime, 1);

            IScheduler scheduler = await _SchedulerFactory.GetScheduler();

            IJobDetail job = JobBuilder.Create(jobType)
                             .WithIdentity(options.JobName, options.JobGroup)
                             .Build();

            ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                   .StartAt(starRunTime)
                                   .EndAt(endRunTime)
                                   .WithIdentity(options.JobName, options.JobGroup)
                                   .WithCronSchedule(options.CromExpress)
                                   .Build();

            await scheduler.ScheduleJob(job, trigger);

            await scheduler.Start();

            return(true);
        }
コード例 #9
0
        private static void CodeMethod()
        {
            Console.WriteLine(DateTime.Now.ToString());
            //1.创建一个作业调度池
            ISchedulerFactory scheduler = new StdSchedulerFactory();
            IScheduler        sched     = scheduler.GetScheduler();
            //2.创建一个具体的作业
            IJobDetail job = JobBuilder.Create <JobDemo>().Build();

            //3.创建并配置一个触发器
            #region   每隔5秒执行一次Execute方法,无休止
            //ISimpleTrigger trigger=(ISimpleTrigger)TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(int.MaxValue)).Build();
            #endregion


            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            DateTimeOffset endTime   = DateBuilder.NextGivenSecondDate(DateTime.Now.AddHours(1), 5);
            #region  每隔5秒执行一次,一共执行50次,开始时间设定在当前时间,结束时间设定在1小时后,不管50次有没有执行完,1小时候程序都不在继续执行
            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime).WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(50)).Build();
            #endregion

            #region 使用cron-like维度调用
            //ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime).WithCronSchedule("11,27 10,20,30 * * * ? ").Build();
            #endregion
            //4.加入作业调度池中
            sched.ScheduleJob(job, trigger);
            sched.Start();
            Console.ReadKey();
        }
コード例 #10
0
        /// <summary>
        /// 添加任务计划//或者进程终止后的开启
        /// </summary>
        /// <returns></returns>
        public static async Task <bool> StartScheduleJobAsync(ScheduleInfo scheduleInfo, bool doatonce)
        {
            try
            {
                if (scheduleInfo != null)
                {
                    if (scheduleInfo.StartRunTime == null)
                    {
                        scheduleInfo.StartRunTime = DateTime.Now;
                    }
                    DateTimeOffset startRunTime = DateBuilder.NextGivenSecondDate(scheduleInfo.StartRunTime, 1);
                    if (scheduleInfo.EndRunTime == null)
                    {
                        scheduleInfo.EndRunTime = DateTime.MaxValue.AddDays(-1);
                    }
                    DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(scheduleInfo.EndRunTime, 1);
                    if (string.IsNullOrWhiteSpace(scheduleInfo.CronExpress) || doatonce)
                    {
                        DateTime dt = DateTime.Now.AddMinutes(1);
                        scheduleInfo.CronExpress = $"0 {dt.Minute} {dt.Hour} * * ?";
                    }
                    _scheduler = await GetSchedulerAsync();

                    Type       type = Type.GetType(scheduleInfo.JobName, true, true);
                    IJobDetail job  = JobBuilder.Create(type)
                                      .WithIdentity(scheduleInfo.JobName, scheduleInfo.JobGroup)
                                      .Build();
                    ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                           .StartAt(startRunTime)
                                           .EndAt(endRunTime)
                                           .WithIdentity(scheduleInfo.JobName, scheduleInfo.JobGroup)
                                           .WithCronSchedule(scheduleInfo.CronExpress)
                                           .Build();
                    ((CronTriggerImpl)trigger).MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing;
                    //将信息写入
                    scheduleInfo.RunStatus = (int)JobStatus.Waiting;
                    Manager.SaveSchedule(scheduleInfo);
                    IList <ICronTrigger> triggers = new List <ICronTrigger> {
                        trigger
                    };
                    await _scheduler.ScheduleJob(job, new ReadOnlyCollection <ICronTrigger>(triggers), true);

                    if (!_scheduler.IsStarted)
                    {
                        await _scheduler.Start();
                    }

                    return(true);
                }
                return(false);
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("because one already exists with this identification"))
                {
                    string ret = await ResumeScheduleJobAsync(scheduleInfo);
                }
                return(false);
            }
        }
コード例 #11
0
        private static void Example1()
        {
            Console.WriteLine(DateTime.Now.ToString("r"));
            //1.首先创建一个作业调度池
            ISchedulerFactory schedf = new StdSchedulerFactory();
            IScheduler        sched  = schedf.GetScheduler().Result;
            //2.创建出来一个具体的作业
            IJobDetail job = JobBuilder.Create <JobDemo>().Build();
            //3.创建并配置一个触发器
            //ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(3)).Build();

            //NextGivenSecondDate:如果第一个参数为null则表名当前时间往后推迟2秒的时间点。
            //使用2:假如没执行完1分钟后不执行
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddMinutes(1), 3);
            //ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime).
            //    WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(100)).Build();

            //使用3:每分钟的第1,10,14,25,35,50秒执行一次。
            //那么上面显然是不能满足的。这是我就把cron-like(由7段构成:秒 分 时 日 月 星期 年(可选))表达式引入进来,以实现各种时间纬度的调用
            //"-" :表示范围  MON-WED表示星期一到星期三
            // "," :表示列举 MON, WEB表示星期一和星期三
            //"*" :表是“每”,每月,每天,每周,每年等
            //"/" :表示增量:0 / 15(处于分钟段里面) 每15分钟,在0分以后开始,3 / 20 每20分钟,从3分钟以后开始
            //"?" :只能出现在日,星期段里面,表示不指定具体的值
            //"L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
            //"W" :表示工作日,距离给定值最近的工作日
            //"#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1 = SUN...6 = FRI,7 = SAT)
            DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3);
            ICronTrigger   trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
                                     .WithCronSchedule("1,10,14,25,35,50 * * * * ? ")
                                     .Build();

            //4.加入作业调度池中
            sched.ScheduleJob(job, trigger);

            //加入第二个作业 1个job只能绑定在1个trigger
            IJobDetail     job2     = JobBuilder.Create <JobDemo2>().WithIdentity("job2", "gorup2").Build();
            ISimpleTrigger trigger2 = (ISimpleTrigger)TriggerBuilder.Create().
                                      WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(2)).Build();

            sched.ScheduleJob(job2, trigger2);

            //5.开始运行
            sched.Start();
            ////挂起3分钟
            //Thread.Sleep(TimeSpan.FromMinutes(3));
            ////3分钟后关闭作业调度,将不在执行
            //sched.Shutdown();

            //暂停所有
            //sched.PauseAll();
            //1分钟后移除trigger2
            Thread.Sleep(TimeSpan.FromMinutes(1));
            //重启
            //sched.ResumeAll();

            sched.UnscheduleJob(trigger2.Key);//移除trigger2
        }
コード例 #12
0
        /// <summary>
        /// 添加任务计划//或者进程终止后的开启
        /// </summary>
        /// <returns></returns>
        public static async Task <bool> StartScheduleJobAsync(Diary info)
        {
            try
            {
                if (info != null)
                {
                    if (info.RunningStart == null)
                    {
                        info.RunningStart = DateTime.Now;
                    }
                    DateTimeOffset startRunTime = DateBuilder.NextGivenSecondDate(info.RunningStart, 1);
                    if (info.RunningEnd == null)
                    {
                        info.RunningEnd = DateTime.MaxValue.AddDays(-1);
                    }
                    DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(info.RunningEnd, 1);
                    if (string.IsNullOrWhiteSpace(info.CronExpress))
                    {
                        DateTime dt = DateTime.Now.AddMinutes(1);
                        info.CronExpress = $"0 {dt.Minute} {dt.Hour} * * ?";
                    }
                    _scheduler = await GetSchedulerAsync();

                    Type       type = typeof(RemindJob); // Type.GetType(info.JobName, true, true);
                    IJobDetail job  = JobBuilder.Create(type)
                                      .WithIdentity(info.JobName, info.JobGroup)
                                      .Build();
                    job.JobDataMap.Put(Common.REMIND_CONTENT, $"【主题】{info.Title}\r\n【内容】{info.Content}");
                    ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                           .StartAt(startRunTime)
                                           .EndAt(endRunTime)
                                           .WithIdentity(info.JobName, info.JobGroup)
                                           .WithCronSchedule(info.CronExpress)
                                           .Build();
                    ((CronTriggerImpl)trigger).MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing;
                    IList <ICronTrigger> triggers = new List <ICronTrigger> {
                        trigger
                    };
                    await _scheduler.ScheduleJob(job, new ReadOnlyCollection <ICronTrigger>(triggers), true);

                    if (!_scheduler.IsStarted)
                    {
                        await _scheduler.Start();
                    }

                    return(true);
                }
                return(false);
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("because one already exists with this identification"))
                {
                    _ = await ResumeScheduleJobAsync(info);
                }
                return(false);
            }
        }
コード例 #13
0
        public void NextGivenSecondDateShouldWork()
        {
            DateTimeOffset dto = new DateTimeOffset(new DateTime(2011, 11, 14, 21, 59, 0));
            var            nextGivenSecondDate = DateBuilder.NextGivenSecondDate(dto, 0);

            Assert.AreEqual(22, nextGivenSecondDate.Hour);
            Assert.AreEqual(0, nextGivenSecondDate.Minute);
            Assert.AreEqual(0, nextGivenSecondDate.Second);
        }
コード例 #14
0
        /// <summary>
        /// 添加调度任务
        /// </summary>
        /// <param name="JobName">任务名称</param>
        /// <param name="JobGroup">任务分组</param>
        /// <param name="JobNamespaceAndClassName">任务完全限定名</param>
        /// <param name="JobAssemblyName">任务程序集名称</param>
        /// <param name="CronExpress">Cron表达式</param>
        /// <param name="StarTime">开始时间</param>
        /// <param name="EndTime">结束时间</param>
        /// <returns></returns>
        public async Task <ScheduleResult> AddJobAsync(String JobName, String JobGroup, String JobNamespaceAndClassName, String JobAssemblyName, string CronExpress)
        {
            ScheduleResult result = new ScheduleResult();

            try
            {
                if (string.IsNullOrEmpty(JobName) || string.IsNullOrEmpty(JobGroup) || string.IsNullOrEmpty(JobNamespaceAndClassName) || string.IsNullOrEmpty(JobAssemblyName) || string.IsNullOrEmpty(CronExpress))
                {
                    result.ResultCode = -3;
                    result.ResultMsg  = $"参数不能为空";
                    return(result);//出现异常
                }
                var            starRunTime = DateTime.Now;
                var            EndTime     = DateTime.MaxValue.AddDays(-1);
                DateTimeOffset endRunTime  = DateBuilder.NextGivenSecondDate(EndTime, 1);
                JobKey         jobKey      = new JobKey(JobName, JobGroup);
                if (await Scheduler.CheckExists(jobKey))
                {
                    await Scheduler.PauseJob(jobKey);

                    await Scheduler.DeleteJob(jobKey);
                }
                Assembly assembly = Assembly.LoadFile(JobAssemblyName);
                Type     jobType  = assembly.GetType(JobNamespaceAndClassName);
                //var jobType = Type.GetType(JobNamespaceAndClassName + "," + JobAssemblyName);
                if (jobType == null)
                {
                    result.ResultCode = -1;
                    result.ResultMsg  = "系统找不到对应的任务,请重新设置";
                    return(result);//出现异常
                }
                IJobDetail job = JobBuilder.Create(jobType)
                                 .WithIdentity(jobKey).UsingJobData("ServerName", Scheduler.SchedulerName)
                                 .Build();
                ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                       .StartAt(starRunTime)
                                       .EndAt(endRunTime)
                                       .WithIdentity(JobName, JobGroup)
                                       .WithCronSchedule(CronExpress)
                                       .Build();
                await Scheduler.ScheduleJob(job, trigger);

                if (!Scheduler.IsStarted)
                {
                    await Scheduler.Start();
                }
                return(result);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, nameof(AddJobAsync));
                result.ResultCode = -4;
                result.ResultMsg  = ex.ToString();
                return(result);//出现异常
            }
        }
コード例 #15
0
        //public int minutos = 40;

        static public bool StarWatchDog()
        {
            // construct a scheduler factory
            ISchedulerFactory schedFact = new StdSchedulerFactory();

            // get a scheduler
            IScheduler sched = schedFact.GetScheduler();



            // jobs can be scheduled before sched.start() has been called

            // get a "nice round" time a few seconds in the future...
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 30);



            // job1 will only fire once at date/time "ts"
            IJobDetail job = JobBuilder.Create <TaskVariable>()
                             .WithIdentity("job1", "group1")
                             .Build();


            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
                                     .WithIdentity("trigger1", "group1")
                                     .StartAt(startTime)
                                     .WithSimpleSchedule(x => x.WithIntervalInMinutes(2).RepeatForever())
                                     //.ForJob(job)
                                     .Build();


            // schedule it to run!
            DateTimeOffset?ft = sched.ScheduleJob(job, trigger);

            IJobDetail job2 = JobBuilder.Create <TaskQuorum>()
                              .WithIdentity("job2", "group1")
                              .Build();


            ISimpleTrigger trigger2 = (ISimpleTrigger)TriggerBuilder.Create()
                                      .WithIdentity("trigger2", "group1")
                                      .StartAt(startTime)
                                      .WithSimpleSchedule(x => x.WithIntervalInMinutes(3).RepeatForever())
                                      //.ForJob(job)
                                      .Build();



            ft = sched.ScheduleJob(job2, trigger2);

            // schedule it to run!
            sched.Start();

            return(true);
        }
コード例 #16
0
        //我想让他每三秒执行一次,一共执行100次,开始执行时间设定在当前时间,结束时间我设定在2小时后,不过100次执行完没2小时候都不再执行
        public static ISimpleTrigger EndTaskWhenHours()
        {
            //NextGivenSecondDate:如果第一个参数为null则表名当前时间往后推迟2秒的时间点。

            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            DateTimeOffset endTime   = DateBuilder.NextGivenSecondDate(DateTime.Now.AddHours(2), 3);
            //创建并配置一个触发器
            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
                                     .WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(100))
                                     .Build();

            return(trigger);
        }
コード例 #17
0
        public bool RunAtOnce(string jobName, string jobGroupName)
        {
            try
            {
                JobKey jobKey = CreateJobKey(jobName, jobGroupName);

                JobDataModel jobData = Xml.XmlJobManage.GetJobDataByKey(jobKey);
                if (jobData == null)
                {
                    return(false);
                }

                JobKey jobKeyOnce = CreateJobKey(jobName, JobConfig.JobGroupNameOnce);

                var type = typeof(HttpJob);

                if (jobData.JobType == JobType.Assembly)
                {
                    string   path     = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, jobData.AssemblyDllName);
                    Assembly assembly = Assembly.LoadFile(path);
                    type = assembly.GetType(jobData.TypeFullName);
                }

                var bl = _scheduler.CheckExists(jobKeyOnce).GetAwaiter().GetResult();
                if (bl)
                {
                    _scheduler.DeleteJob(jobKeyOnce);
                }
                IJobDetail jobDetail = JobBuilder.Create(type)
                                       .WithIdentity(jobKeyOnce)
                                       .UsingJobData(JobConfig.CallbackUrl, jobData.CallbackUrl)
                                       .UsingJobData(JobConfig.CallbackParams, JobUtils.GetDictToString(jobData.CallbackParams))
                                       .Build();

                DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 2);
                ITrigger       trigger   = TriggerBuilder.Create()
                                           .WithIdentity(JobConfig.GetTriggerNameOnce(jobName), JobConfig.TriggerGroupNameOnce)
                                           .StartAt(startTime)
                                           .Build();

                _scheduler.ScheduleJob(jobDetail, trigger).GetAwaiter().GetResult();
                return(true);
            }
            catch (Exception ex)
            {
                logger.Error(ex);
            }

            return(false);
        }
コード例 #18
0
        /// <summary>
        /// 创建类型Cron的触发器
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        private static ITrigger CreateCronTrigger(TasksQz tasksQz)
        {
            DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(tasksQz.StartTime ?? DateTime.Now, 1);
            DateTimeOffset endRunTime  = DateBuilder.NextGivenSecondDate(tasksQz.EndTime ?? DateTime.MaxValue.AddDays(-1), 1);

            // 作业触发器
            return(TriggerBuilder.Create()
                   .WithIdentity(tasksQz.Id.ToString(), tasksQz.JobGroup)
                   .StartAt(starRunTime)                            //开始时间
                   .EndAt(endRunTime)                               //结束数据
                   .WithCronSchedule(tasksQz.Cron)                  //指定cron表达式
                   .ForJob(tasksQz.Id.ToString(), tasksQz.JobGroup) //作业名称
                   .Build());
        }
コード例 #19
0
ファイル: QuartzHelper.cs プロジェクト: IvanMeng/LearunTC
        /// <summary>
        /// 添加多触发器任务
        /// </summary>
        /// <param name="jobName">任务名称</param>
        /// <param name="jobGroupName">任务组名称</param>
        /// <param name="starTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <param name="keyValue">任务主键</param>
        /// <param name="list">cron数组</param>
        public static void AddListCronJob(string jobName, string starTime, string endTime, string keyValue, List <string> list)
        {
            try
            {
                IScheduler sched = schedFact.GetScheduler();            //得到一个调度程序

                IJobDetail job = JobBuilder.Create <SchedulingHelper>() //新建任务执行类
                                 .WithIdentity(jobName, "lrts")         // name "myJob", group "group1"
                                 .UsingJobData("keyValue", keyValue)    //传递参数
                                 .StoreDurably()
                                 .Build();
                ///开始时间处理
                DateTime StarTime = DateTime.Now;
                if (!string.IsNullOrEmpty(starTime))
                {
                    StarTime = Convert.ToDateTime(starTime);
                }
                DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(StarTime, 1);
                ///结束时间处理
                DateTime EndTime = DateTime.MaxValue.AddDays(-1);
                if (!string.IsNullOrEmpty(endTime))
                {
                    EndTime = Convert.ToDateTime(endTime);
                }
                DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(EndTime, 1);
                sched.AddJob(job, true);
                // 创建一个时间触发器
                for (var i = 0; i < list.Count; i++)
                {
                    ITrigger trigger = TriggerBuilder.Create()
                                       .WithIdentity("trigger" + Guid.NewGuid().ToString())
                                       .StartAt(starRunTime)
                                       .EndAt(endRunTime)
                                       .ForJob(job)
                                       .WithCronSchedule(list[i])
                                       .Build();
                    sched.ScheduleJob(trigger);
                }
                // 启动
                if (!sched.IsStarted)
                {
                    sched.Start();
                }
            }
            catch (Exception e)
            {
                throw (e);
            }
        }
コード例 #20
0
        /// <summary>
        /// 添加调度任务
        /// </summary>
        /// <param name="jobName">任务名称</param>
        /// <param name="jobGroup">任务分组</param>
        /// <returns></returns>
        public async Task <bool> AddJobAsync(CreateUpdateJobInfoDto infoDto)
        {
            try
            {
                if (infoDto != null)
                {
                    if (infoDto.StarTime == null)
                    {
                        infoDto.StarTime = DateTime.Now;
                    }
                    DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(infoDto.StarTime, 1);
                    if (infoDto.EndTime == null)
                    {
                        infoDto.EndTime = DateTime.MaxValue.AddDays(-1);
                    }
                    DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(infoDto.EndTime, 1);
                    scheduler = await GetSchedulerAsync();

                    JobKey jobKey = new JobKey(infoDto.JobName, infoDto.JobGroup);
                    if (await scheduler.CheckExists(jobKey))
                    {
                        await scheduler.PauseJob(jobKey);

                        await scheduler.DeleteJob(jobKey);
                    }
                    IJobDetail job = JobBuilder.Create <LogTestJob>()
                                     .WithIdentity(jobKey)
                                     .Build();
                    ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                           .StartAt(starRunTime)
                                           .EndAt(endRunTime)
                                           .WithIdentity(infoDto.JobName, infoDto.JobGroup)
                                           .WithCronSchedule(infoDto.CronExpress)
                                           .Build();
                    await scheduler.ScheduleJob(job, trigger);

                    await scheduler.Start();

                    return(true);
                }

                return(false);//JobInfo为空
            }
            catch (Exception ex)
            {
                _logger.LogException(ex);
                return(false);//出现异常
            }
        }
コード例 #21
0
        public static async Task <bool> AddJob(QuartzModel model)
        {
            var IsSuccess = false;
            var sche      = await GetScheduler();

            model.SchedName = sche.SchedulerName;
            //验证是否是正确的Cron表达式
            if (CronExpression.IsValidExpression(model.TriggerCron))
            {
                JobKey jk = new JobKey(model.JobName, model.JobGroup);
                //var scheduRes = sche.Result;
                var IsExist = sche.CheckExists(jk).GetAwaiter().GetResult();
                if (IsExist)
                {
                    LogHelper.WriteError($"Job:{model.JobName}已存在", new Exception($"Job:{model.JobName}已存在"));
                    //throw new Exception($"Job:{model.JobName}已存在");
                    return(false);
                }
                var type = GetClassInfo(model.JobClassName);
                if (type != null)
                {
                    if (model.StarRunTime == null)
                    {
                        model.StarRunTime = DateTime.Now;
                    }
                    DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(model.StarRunTime, 1);
                    if (model.EndRunTime == null)
                    {
                        model.EndRunTime = DateTime.MaxValue.AddDays(-1);
                    }
                    DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(model.EndRunTime, 1);
                    IJobDetail     job        = new JobDetailImpl(model.JobName, model.JobGroup, type);

                    ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                           .StartAt(starRunTime)
                                           .EndAt(endRunTime)
                                           .WithDescription(model.Description)
                                           .WithIdentity(model.JobName, model.JobGroup)
                                           .WithCronSchedule(model.TriggerCron)
                                           .Build();


                    sche.ScheduleJob(job, trigger).GetAwaiter().GetResult();
                    LogHelper.WriteInfo($"Job:{model.JobName}添加完成");
                    IsSuccess = true;
                }
            }
            return(IsSuccess);
        }
コード例 #22
0
ファイル: JobHelper.cs プロジェクト: yqt123/QuartzService
        /// <summary>
        /// 创建只触发一次的触发器
        /// </summary>
        /// <param name="secondBase">时间</param>
        /// <param name="forJob">此触发器将关联到哪一个作业</param>
        /// <returns></returns>
        public static ISimpleTrigger CreateOnceTrigger(int secondBase, IJobDetail forJob = null)
        {
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, secondBase);
            TriggerBuilder builder   =
                TriggerBuilder.Create()
                .WithIdentity(System.Guid.NewGuid().ToString())
                .WithDescription("此触发器只执行一次.")
                .StartAt(startTime);

            if (forJob != null)
            {
                builder = builder.ForJob(forJob);
            }
            return((ISimpleTrigger)builder.Build());
        }
コード例 #23
0
        protected override ITrigger CreateTrigger(string name)
        {
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 5);

            /*
             *           Seconds Minutes Hours Day-of-Month Month Day-of-Week Year (optional field)
             *           the value “L” in the day-of-month field means “the last day of the month” - day 31 for January,
             * day 28 for February on non-leap years
             */
            return(TriggerBuilder.Create()
                   .WithIdentity(name, "serviceGroups")
                   //.WithCronSchedule("0 30 0 * * ?")
                   .StartAt(startTime)
                   .Build());
        }
コード例 #24
0
        /// <summary>
        /// 添加一个工作调度(映射程序集指定IJob实现类)
        /// </summary>
        /// <returns></returns>
        private void AddScheduleJobAsync(TaskScheduleModel m)
        {
            if (!IsStart)
            {
                throw new Exception("任务计划未初始化");
            }
            //检查任务是否已存在
            var jk = new JobKey(m.JobName, m.JobGroup);

            if (scheduler.CheckExists(jk).Result)
            {
                //删除已经存在任务
                scheduler.PauseJob(jk).Wait();  //先暂停
                scheduler.DeleteJob(jk).Wait(); //在删除
                Logger.LogInformation($"移除了老任务{m.JobGroup}.{m.JobName}");
            }
            DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(m.StarRunTime, 1);
            DateTimeOffset endRunTime  = DateBuilder.NextGivenSecondDate(m.EndRunTime, 1);
            //反射获取IJob实现
            string   dllFilePath = Path.Combine(WebHostEnvironment.WebRootPath, "JobPlugins") + "/" + m.FileName;
            Assembly assembly    = Assembly.LoadFile(dllFilePath);

            Type[] types    = assembly.GetExportedTypes();
            Type   typeIJob = typeof(IJob);
            Type   jobType  = null;

            for (int i = 0; i < types.Length; i++)
            {
                if (typeIJob.IsAssignableFrom(types[i]) && !types[i].IsAbstract)
                {
                    jobType = types[i];
                    break;
                }
            }
            IJobDetail job = JobBuilder.Create(jobType)
                             .WithIdentity(m.JobName, m.JobGroup)
                             .Build();
            ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                   .StartAt(starRunTime)
                                   .EndAt(endRunTime)
                                   .WithIdentity(m.JobName, m.JobGroup)
                                   .WithCronSchedule(m.CronExpress)
                                   .Build();

            scheduler.ScheduleJob(job, trigger).Wait();
            Logger.LogInformation($"创建新任务{m.JobGroup}.{m.JobName}");
        }
コード例 #25
0
        private async Task <bool> StartScheduleJobAsync(ScheduleInfo scheduleInfo)
        {
            try
            {
                if (scheduleInfo != null)
                {
                    if (scheduleInfo.BeginTime == null)
                    {
                        scheduleInfo.BeginTime = DateTime.Now;
                    }
                    DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(scheduleInfo.BeginTime, 1);
                    if (scheduleInfo.EndTime == null)
                    {
                        scheduleInfo.EndTime = DateTime.MaxValue.AddDays(-1);
                    }
                    var keys = new Dictionary <string, string>()
                    {
                        { "RequestUrl", scheduleInfo.RequestUrl },
                        { "RequestType", scheduleInfo.RequestType.ToString() },
                        { "JobId", scheduleInfo.Id.ToString() }
                    };
                    DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(scheduleInfo.EndTime, 1);
                    IJobDetail     job        = JobBuilder.Create <HttpJob>()
                                                .SetJobData(new JobDataMap(keys))
                                                .WithIdentity(scheduleInfo.JobName, scheduleInfo.JobGroup)
                                                .Build();
                    ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                           .StartAt(starRunTime)
                                           .EndAt(endRunTime)
                                           .WithIdentity(scheduleInfo.JobName, scheduleInfo.JobGroup)
                                           .WithCronSchedule(scheduleInfo.Cron)
                                           .Build();

                    await _scheduler.ScheduleJob(job, trigger);

                    await _scheduler.Start();

                    //  await StopScheduleJobAsync(scheduleInfo.JobGroup, scheduleInfo.JobName);
                    return(true);
                }
                return(false);
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
コード例 #26
0
        public async Task RunAsync()
        {
            IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();

            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 10);

            IJobDetail job = JobBuilder.Create <InterruptJob>()
                             .WithIdentity("job1", "jobGroup1")
                             .Build();

            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
                                     .WithIdentity("trigger1", "triggerGroup1")
                                     .StartAt(startTime)
                                     .WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever())
                                     .Build();

            DateTimeOffset df = await scheduler.ScheduleJob(job, trigger);

            ConsoleExtend.WriteLineRed($"作业【{job.Key}】 触发器【{trigger.Key}】 执行时间【{df.LocalDateTime}】 " +
                                       $"执行时间间隔【{trigger.RepeatInterval.Seconds}】s 重复执行次数【{trigger.RepeatCount}】");
            await scheduler.Start();

            Console.WriteLine("每7秒中断一次调度");

            for (int i = 0; i < 50; i++)
            {
                await Task.Delay(TimeSpan.FromSeconds(7));

                try
                {
                    await scheduler.Interrupt(job.Key);
                }
                catch (Exception ex)
                {
                    ConsoleExtend.WriteLineError(ex.Message);
                }
            }

            await scheduler.Shutdown(true);

            SchedulerMetaData metaData = await scheduler.GetMetaData();

            ConsoleExtend.WriteLineDebug2($"执行了 {metaData.NumberOfJobsExecuted} 次作业.");
            ConsoleExtend.WriteLineDebug2($"作业【{job.Key}】 中循环共执行了【{InterruptJob.ExecutedCount}】次" +
                                          $",其中成功【{InterruptJob.SuccessfulCount}】次,中断【{InterruptJob.InterruptlCount}】次");
        }
コード例 #27
0
        /// <summary>
        /// 添加一个工作调度
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        private bool AddScheduleJob <T>(ScheduleEntity m) where T : IJob
        {
            try
            {
                if (m != null)
                {
                    if (m.StarRunTime == null)
                    {
                        m.StarRunTime = DateTime.Now;
                    }

                    var starRunTime = DateBuilder.NextGivenSecondDate(m.StarRunTime, 1);

                    if (m.EndRunTime == null)
                    {
                        m.EndRunTime = DateTime.Now;
                    }
                    var        endRunTime = DateBuilder.NextGivenSecondDate(m.EndRunTime, 1);
                    IJobDetail job        = job = JobBuilder.Create <T>()
                                                  .WithIdentity(m.JobName, m.JobGroup).Build();
                    ITrigger trigger = null;
                    if (!string.IsNullOrEmpty(m.CronStr))
                    {
                        trigger = (ICronTrigger)TriggerBuilder.Create()
                                  .StartAt(starRunTime)
                                  .EndAt(endRunTime)
                                  .WithIdentity(m.JobName, m.JobGroup)
                                  .WithCronSchedule(m.CronStr)
                                  .Build();
                    }
                    else
                    {
                        trigger = (ISimpleTrigger)TriggerBuilder.Create().StartAt(starRunTime).WithSimpleSchedule(x => x.WithIntervalInSeconds(1).WithRepeatCount(0)).Build();
                    }
                    Scheduler.ScheduleJob(job, trigger);
                    Scheduler.Start();
                    StopScheduleJob <ScheduleManage>(m.JobGroup, m.JobName);
                    return(true);
                }
                return(false);
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
コード例 #28
0
ファイル: ScheduleManager.cs プロジェクト: jclown/test
        public static async void CreateJob <T>(string cron, DateTime?endTime = null) where T : IJob
        {
            var name  = NewToken();
            var group = NewToken();
            var job   = JobBuilder.Create <T>()
                        .WithIdentity(name, group)
                        .Build();

            var cronTrigger = TriggerBuilder.Create()
                              .StartAt(DateBuilder.NextGivenSecondDate(DateTime.Now, 1))
                              .EndAt(endTime ?? DateTime.Now.AddYears(100))
                              .WithIdentity(name + "Trigger", group + "Trigger")
                              .WithCronSchedule(cron)
                              .Build();

            await scheduler.ScheduleJob(job, cronTrigger);
        }
コード例 #29
0
 private void InitializeQuartz()
 {
     ISchedulerFactory sf = new StdSchedulerFactory();
     IScheduler sched = sf.GetScheduler();
     DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTime.UtcNow);
     DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 5);
     IJobDetail job = JobBuilder.Create<QueueConsumer>()
         .WithIdentity("job1", "group1")
         .Build();
     ITrigger trigger = TriggerBuilder.Create()
         .WithIdentity("trigger1", "group1")
         .StartAt(runTime)
         .WithCronSchedule("5 0/1 * * * ?")
         .Build();
     sched.ScheduleJob(job, trigger);
     sched.Start();
 }
コード例 #30
0
        /// <summary>
        /// 添加任务计划//或者进程终止后的开启
        /// </summary>
        /// <returns></returns>
        public async Task <bool> AddScheduleJobAsync(ScheduleInfo m)
        {
            try
            {
                if (m != null)
                {
                    if (m.StarRunTime == null)
                    {
                        m.StarRunTime = DateTime.Now;
                    }
                    DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(m.StarRunTime, 1);
                    if (m.EndRunTime == null)
                    {
                        m.EndRunTime = DateTime.MaxValue.AddDays(-1);
                    }
                    DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(m.EndRunTime, 1);
                    scheduler = await GetSchedulerAsync();

                    IJobDetail job = JobBuilder.Create <HttpJob>()
                                     .WithIdentity(m.JobName, m.JobGroup)
                                     .Build();
                    ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                           .StartAt(starRunTime)
                                           .EndAt(endRunTime)
                                           .WithIdentity(m.JobName, m.JobGroup)
                                           .WithCronSchedule(m.CromExpress)
                                           .Build();
                    //将信息写入
                    await _scheduleManage.AddScheduleAsync(m);

                    await scheduler.ScheduleJob(job, trigger);

                    await scheduler.Start();
                    await StopScheduleJobAsync(m.JobGroup, m.JobName);

                    return(true);
                }
                return(false);
            }
            catch (Exception ex)
            {
                //MyLogger.WriteError(ex, null);
                return(false);
            }
        }