Esempio n. 1
0
        public async Task <JobKey> ScheduleJob <T>(DateTimeOffset?startAtTime = null, JobKey?vncCheckerJobKey = null)
            where T : class, IJob
        {
            IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();

            await scheduler.Start();

            IJobDetail jobDetail = JobBuilder.Create <T>().Build();

            ITrigger       trigger;
            TriggerBuilder triggerBuilder = TriggerBuilder.Create().StartNow()
                                            .WithSimpleSchedule(x => x.WithIntervalInSeconds(Constants.JobEecutionIntervalSec)
                                                                .RepeatForever());

            if (vncCheckerJobKey != null)
            {
                triggerBuilder = triggerBuilder.UsingJobData(nameof(Checker), vncCheckerJobKey.Name);
            }

            if (startAtTime != null)
            {
                trigger = triggerBuilder.StartAt((DateTimeOffset)startAtTime).Build();
            }
            else
            {
                trigger = triggerBuilder.StartNow().Build();
            }

            await scheduler.ScheduleJob(jobDetail, trigger);

            return(jobDetail.Key);
        }
Esempio n. 2
0
        public async Task <DateTimeOffset?> ScheduleRemoveOldEventsJob(int intervalSecs, DateTime?startAt)
        {
            ValidateRemoveOldEventsJobSchedule();
            TriggerBuilder builder = TriggerBuilder.Create()
                                     .WithIdentity(RemoveOldEventsTriggerKey);

            if (startAt != null)
            {
                builder = builder.StartAt(startAt.Value);
            }
            else
            {
                builder = builder.StartNow();
            }
            builder = builder.WithSimpleSchedule(x => x
                                                 .WithInterval(TimeSpan.FromSeconds(intervalSecs))
                                                 .RepeatForever());
            var trigger    = builder.ForJob(RemoveOldEventsJobKey).Build();
            var oldTrigger = await Scheduler.GetTrigger(RemoveOldEventsTriggerKey);

            if (oldTrigger != null)
            {
                return(await Scheduler.RescheduleJob(RemoveOldEventsTriggerKey, trigger));
            }
            return(await Scheduler.ScheduleJob(trigger));
        }
 public static TriggerBuilder WithCronScheduleNowIfEmpty(this TriggerBuilder triggerBuilder, string cronExpression)
 {
     if (string.IsNullOrWhiteSpace(cronExpression))
     {
         return(triggerBuilder.StartNow());
     }
     return(triggerBuilder.WithCronSchedule(cronExpression));
 }
Esempio n. 4
0
        public static TriggerBuilder Start_(this TriggerBuilder builder, DateTimeOffset?when = null)
        {
            var res = when == null?
                      builder.StartNow() :
                          builder.StartAt(when.Value);

            return(res);
        }
Esempio n. 5
0
 /// <summary>
 /// 设置作业开始时间
 /// </summary>
 private void SetStartTime(TriggerBuilder builder, JobBase job)
 {
     if (job.GetStartTime() == null)
     {
         builder.StartNow();
         return;
     }
     builder.StartAt(job.GetStartTime().SafeValue());
 }
Esempio n. 6
0
 public void ConfigureTrigger(TriggerBuilder trigger)
 {
     trigger.StartNow()
     .WithSimpleSchedule(schedule =>
     {
         schedule.RepeatForever()
         .WithIntervalInHours(24)
         .Build();
     });
 }
Esempio n. 7
0
        public static ITrigger GetTrigger()
        {
            //创建一个触发器
            TriggerBuilder triggerBuilder = TriggerBuilder.Create();

            triggerBuilder.StartNow();                                                          //现在开始
            //triggerBuilder.WithCronSchedule("/5 * * ? * *");//时间表达式
            triggerBuilder.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever()); //触发时间,5秒一次。
            ITrigger jobTrigger = triggerBuilder.Build();

            return(jobTrigger);
        }
Esempio n. 8
0
        /// <summary>
        /// 启动定时器框架-自动扫描注入启动
        /// </summary>
        /// <param name="app"></param>
        public static void UseQuartz(this IApplicationBuilder app)
        {
            var serviceProvider = app.ApplicationServices;
            var scheduler       = serviceProvider.GetRequiredService <IScheduler>();
            var jobFactory      = serviceProvider.GetRequiredService <IJobFactory>();

            scheduler.JobFactory = jobFactory;


            // add jobdetail with trigger to scheduler
            var jobs = app.ApplicationServices.GetServices <IJob>();

            foreach (var job in jobs)
            {
                var jobDesc    = job.GetType().GetCustomAttribute <JobDescriptionAttribute>();
                var jobBuilder = JobBuilder.Create(job.GetType());
                if (jobDesc != null)
                {
                    jobBuilder.WithIdentity(jobDesc.Key, jobDesc.Group).WithDescription(jobDesc.Description);
                }
                var jobDetail = jobBuilder.Build();

                ITrigger trigger;
                var      triggerDesc = job.GetType().GetCustomAttribute <IntervalTriggerAttribute>();
                if (triggerDesc == null)
                {
                    // default trigger
                    trigger = TriggerBuilder.Create().StartNow()
                              .WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever()).Build();
                }
                else
                {
                    TriggerBuilder temp = TriggerBuilder.Create().WithIdentity(triggerDesc.Key, triggerDesc.Group).WithDescription(triggerDesc.Description);
                    if (triggerDesc.StartNow)
                    {
                        temp = temp.StartNow();
                    }
                    if (triggerDesc.IsRepeatForever)
                    {
                        temp = temp.WithSimpleSchedule(x => x.WithIntervalInSeconds(triggerDesc.IntervalInSeconds)
                                                       .RepeatForever());
                    }
                    else
                    {
                        temp = temp.WithSimpleSchedule(x => x.WithIntervalInSeconds(triggerDesc.IntervalInSeconds)
                                                       .WithRepeatCount(triggerDesc.RepeatCount));
                    }
                    trigger = temp.Build();
                }
                scheduler.ScheduleJob(jobDetail, trigger).Wait();
            }
            scheduler.Start().Wait();
        }
Esempio n. 9
0
        static IScheduler scheduler = null;//            sf.GetScheduler();

        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jobName"></param>
        /// <param name="triggerName"></param>
        /// <param name="item"></param>
        /// <param name="seconds">多久执行一次,</param>
        /// <param name="count">执行多少次</param>
        /// <param name="date"></param>
        public static void JobsEx <T>(string jobName, string triggerName, KeyValuePair <string, object>?item = null,
                                      int seconds = 1, int count = 1, DateTimeOffset?date = null)
        {
#if NET40 || NET45
            scheduler = sf.GetScheduler();
#else
            scheduler = sf.GetScheduler().Result;
#endif
            scheduler.Start();

            IJobDetail detail = JobBuilder.Create(typeof(T)).WithIdentity(jobName).Build(); //new JobDetailImpl(jobName, typeof(T));

            if (item.HasValue)
            {
                detail.JobDataMap.Add(item.Value);
            }

            TriggerBuilder builder = TriggerBuilder.Create().WithIdentity(triggerName); //TriggerBuilder.Create().WithIdentity(triggerName).StartAt(date.HasValue ? date.Value : DateTimeOffset.Now);
            if (date.HasValue)
            {
                builder = builder.StartAt(date.Value);
            }
            else
            {
                builder = builder.StartNow();
            }

            if (count > 1)
            {
                if (seconds < 1)
                {
                    seconds = 1;
                }
                builder = builder.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).WithRepeatCount(count - 1));
            }
            else
            {
                builder = builder.WithSimpleSchedule();
            }

            ITrigger trigger = builder.Build();
            scheduler.ScheduleJob(detail, trigger);

            LogHelper.Info("scheduler is start " + DateTime.Now.ToStringEx());
            //if (item.HasValue)
            //    logger.Info("scheduler param[" + JsonConvert.SerializeObject(item.Value) + "]", nameof(JobExtend));

            //logger.Info("scheduler is shutdown:" + scheduler.IsShutdown);
            //Console.WriteLine("scheduler is start" + DateTime.Now.ToString());
        }
Esempio n. 10
0
        //WithSimpleSchedule
        private static void Scheduler1()
        {
            try
            {
                Console.ReadLine();

                //开启日志输出
                Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter {
                    Level = Common.Logging.LogLevel.Info
                };
                ILog log = LogManager.GetLogger(typeof(Program));

                //从计划器工作实例化一个计划实例;
                IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
                //定义一个job
                IJobDetail job = JobBuilder.Create <Job1>()
                                 .WithIdentity("job1", "grop1")
                                 .UsingJobData("jobSays", "Hello World!")
                                 .UsingJobData("myFloatValue", 3.141f)
                                 .Build();

                //定义一个trigger
                ITrigger       trigger        = null;
                TriggerBuilder triggerBuilder = TriggerBuilder.Create();


                triggerBuilder.WithIdentity("trigger1", "group1");
                triggerBuilder.StartNow();                                                          //按当前时间立即执行
                triggerBuilder.WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever()); //每3秒执行,永远重复
                trigger = triggerBuilder.Build();

                //开始为任务做计划
                DateTimeOffset dto = scheduler.ScheduleJob(job, trigger);

                // 计划任务开始
                scheduler.Start();

                // some sleep to show what's happening
                //Thread.Sleep(TimeSpan.FromSeconds(2));

                // and last shut down the scheduler when you are ready to close your program
                //scheduler.Shutdown();

                //Console.ReadLine();
            }
            catch (SchedulerException se)
            {
                Console.WriteLine(se);
            }
        }
        private ITrigger CreateTrigger(JobInfo jobInfo)
        {
            TriggerBuilder triggerBuilder = TriggerBuilder.Create().WithIdentity(jobInfo.JobName, jobInfo.JobGroup);

            if (!string.IsNullOrEmpty(jobInfo.Crons))
            {
                //失火策略
                triggerBuilder.WithCronSchedule(jobInfo.Crons);
            }

            triggerBuilder.StartNow();

            ITrigger trigger = triggerBuilder.Build();

            return(trigger);
        }
        public static async Task StartAsync(CronScheduleBuilder cronStart, JobDataMap data, bool startNow = false)
        {
            TriggerBuilder builder = TriggerBuilder.Create();

            builder.WithSchedule(cronStart);
            if (startNow)
            {
                builder.StartNow();
            }

            var schedulerFactory = new StdSchedulerFactory();
            var scheduler        = await schedulerFactory.GetScheduler();

            await scheduler.Start();

            await scheduler.ScheduleJob(JobBuilder.Create <ChangedTokenJob>().UsingJobData(data).Build(), builder.Build());
        }
Esempio n. 13
0
        /// <summary>
        /// 创建cronExpression trigger
        /// </summary>
        /// <param name="code">唯一编码</param>
        /// <param name="group">组名</param>
        /// <param name="cronExpression">周期表达式</param>
        /// <param name="startNow">是否立刻启动</param>
        /// <param name="timeOffset">多少时间后启动</param>
        /// <returns></returns>
        private static ITrigger CreateTrigger(string code, string group, string cronExpression, bool startNow, DateTimeOffset timeOffset)
        {
            TriggerBuilder triggerBuilder = TriggerBuilder.Create()
                                            .WithIdentity(GetTriggerIdentityName(code), GetTriggerIdentifyGroup(group))
                                            // 运行模式
                                            .WithCronSchedule(cronExpression);

            if (startNow)
            {
                triggerBuilder.StartNow();
            }
            else
            {
                if (timeOffset != null)
                {
                    triggerBuilder.StartAt(timeOffset);
                }
            }

            return(triggerBuilder.Build());
        }
Esempio n. 14
0
        public static async void AddTaskTriggerForJob(Models.Task task, User user)
        {
            try
            {
                TriggerBuilder triggerBuilder = TriggerBuilder.Create()
                                                .WithIdentity(task.Id.ToString())
                                                .WithCronSchedule(task.Period);
                if (DateTime.Now >= DateTime.Parse(task.StartTime))
                {
                    triggerBuilder.StartNow();
                }
                else
                {
                    triggerBuilder.StartAt(DateTimeOffset.Parse(task.StartTime));
                }

                ITrigger trigger = null;
                if (task.ApiId == (int)APIID.COVID) // создание триггеров на задачи по получанию данных covid
                {
                    trigger = triggerBuilder.ForJob(covidJobName).Build();
                }
                else if (task.ApiId == (int)APIID.FOREX) // создание триггеров на задачи по получанию данных forex
                {
                    trigger = triggerBuilder.ForJob(forexJobName).Build();
                }
                else if (task.ApiId == (int)APIID.QUOTE) // создание триггеров на задачи по получанию данных quote
                {
                    trigger = triggerBuilder.ForJob(quoteJobName).Build();
                }
                trigger.JobDataMap["apiParam"] = task.ApiParam;
                trigger.JobDataMap["idTask"]   = task.Id;
                trigger.JobDataMap["userMail"] = user.Email;
                await scheduler.ScheduleJob(trigger);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
            }
        }
        private ITrigger CreateTrigger(ScriptAbs script)
        {
            TriggerBuilder triggerBuilder = TriggerBuilder
                                            .Create()
                                            .WithIdentity(GetTriggerKeyForScript(script));

            if (script is ScriptScheduled scriptScheduled)
            {
                triggerBuilder
                .StartAt(GetTriggerStartAt(scriptScheduled.ScheduledHour))
                .WithSimpleSchedule(x => x
                                    .WithIntervalInHours(24)
                                    .RepeatForever()
                                    );
            }
            else
            {
                triggerBuilder.StartNow();
            }

            return(triggerBuilder.Build());
        }
Esempio n. 16
0
        public async Task <DateTimeOffset?> TriggerSendUnsentEventsJob(DateTime?startAt)
        {
            ValidateSendUnsentJobSchedule();
            TriggerBuilder builder = TriggerBuilder.Create()
                                     .WithIdentity(nameof(SendUnsentEventsJob) + Guid.NewGuid().ToString(), Constants.Group.General);

            if (startAt != null)
            {
                builder = builder.StartAt(startAt.Value);
            }
            else
            {
                builder = builder.StartNow();
            }
            var trigger    = builder.ForJob(SendUnsentEventsJobKey).Build();
            var oldTrigger = await Scheduler.GetTrigger(SendUnsentEventsJobTriggerKey);

            if (oldTrigger != null)
            {
                return(await Scheduler.RescheduleJob(SendUnsentEventsJobTriggerKey, trigger));
            }
            return(await Scheduler.ScheduleJob(trigger));
        }
Esempio n. 17
0
        /// <summary>
        /// 创建 Trigger
        /// </summary>
        /// <param name="jobInfo"></param>
        /// <returns></returns>
        private ITrigger CreateTrigger(JobInfo jobInfo)
        {
            TriggerBuilder tiggerBuilder = TriggerBuilder.Create().WithIdentity(jobInfo.JobName, jobInfo.JobGroup);

            if (!string.IsNullOrWhiteSpace(jobInfo.Cron))
            {
                //错过的不管了,剩下的按正常执行。
                //tiggerBuilder.WithCronSchedule(jobInfo.Cron, c => c.WithMisfireHandlingInstructionDoNothing());

                ////错过的合并为一次执行,后续正常执行。
                tiggerBuilder.WithCronSchedule(jobInfo.Cron, c => c.WithMisfireHandlingInstructionFireAndProceed());

                ////错过的马上执行掉,后续正常执行
                //tiggerBuilder.WithCronSchedule(jobInfo.Cron, c => c.WithMisfireHandlingInstructionIgnoreMisfires());
            }
            else
            {
                tiggerBuilder.WithSimpleSchedule(simple =>
                {
                    //按正常频率执行未执行过的次数
                    simple.WithIntervalInSeconds(jobInfo.Second).RepeatForever().WithMisfireHandlingInstructionNextWithExistingCount();
                });
            }

            if (jobInfo.StartTime > DateTime.Now)
            {
                tiggerBuilder.StartAt(jobInfo.StartTime);
            }
            else
            {
                tiggerBuilder.StartNow();
            }

            ITrigger trigger = tiggerBuilder.Build();

            return(trigger);
        }
Esempio n. 18
0
        /// <summary>
        /// 执行JOB 用于检查Job_Info表
        /// </summary>
        /// <param name="context"></param>
        public void Execute(IJobExecutionContext context)
        {
            Log4NetHelper.Info("开始获取JobInfo", logger: logger);
            try
            {
                List <Job_Info> jobList = new JobInfoBLL().GetJobList();
                if (jobList != null && jobList.Count > 0)
                {
                    JobKey jobKey = null;
                    foreach (var jobinfo in jobList)
                    {
                        jobKey = new JobKey(jobinfo.Job_name + JobConfig.JOBKEY_NAMEEND, "group1");
                        //只有正常执行状态的Job才添加到调度器中
                        if (!JobConfig.scheduler.CheckExists(jobKey) && jobinfo.Job_state == 0)
                        {
                            IJobDetail job = JobBuilder.Create <RunTaskDLLJob>().WithIdentity(jobKey).Build();

                            //创建触发器
                            TriggerBuilder tb = TriggerBuilder.Create()
                                                .WithIdentity(jobinfo.Job_name + JobConfig.JOBTRIGGER_NAMEEND, "group1");
                            if (!string.IsNullOrEmpty(jobinfo.Job_corn))
                            {
                                tb.WithCronSchedule(jobinfo.Job_corn); //执行corn表达式
                            }
                            if (jobinfo.Job_execount > 0)              //如果执行固定的次数
                            {
                                tb.WithSimpleSchedule(a => a.WithRepeatCount(jobinfo.Job_execount));
                            }

                            if (jobinfo.Job_starttime != null && jobinfo.Job_starttime > DateTime.Now)//设置Job启动时间
                            {
                                tb.StartAt(jobinfo.Job_starttime);
                            }
                            else
                            {
                                tb.StartNow();
                            }

                            ITrigger trigger = tb.Build();
                            //传递参数
                            job.JobDataMap.Add(jobKey.Name, jobinfo.Id);

                            JobConfig.scheduler.ScheduleJob(job, trigger);

                            Log4NetHelper.Info(string.Format("加入Job:{0}成功", jobKey.Name), logger: logger);
                        }
                        else if (JobConfig.scheduler.CheckExists(jobKey))
                        {
                            if (jobinfo.Job_state == 2 || jobinfo.Job_state == 3)
                            {
                                JobConfig.scheduler.PauseJob(jobKey);
                                Log4NetHelper.Info(string.Format("暂停Job:{0}成功", jobKey.Name), logger: logger);
                            }
                            else if (jobinfo.Job_state == 4)
                            {
                                JobConfig.scheduler.DeleteJob(jobKey);
                                Log4NetHelper.Info(string.Format("删除Job:{0}成功", jobKey.Name), logger: logger);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log4NetHelper.Info(string.Format("LoopJob异常:{0},{1},{2}", ex.Message, ex.InnerException, ex.StackTrace), logger: logger);
            }
            Log4NetHelper.Info("结束获取JobInfo", logger: logger);
        }
Esempio n. 19
0
        public static string create_job(JOB_TYPE type, string group_name, Dictionary <string, object> para = null, string schedule = null)
        {
            if (para == null)
            {
                para = new Dictionary <string, object>()
                {
                }
            }
            ;
            group_name = group_name.ToLower();
            string name = group_name + "." + DateTime.Now.ToString("yyMMdd-HHmmss-fff");

            if (!string.IsNullOrEmpty(schedule))
            {
                name += "." + schedule;
            }

            JobDataMap m = new JobDataMap();

            m.Put("ID___", name);
            m.Put("SCHEDULE___", schedule);
            m.Put("TYPE___", type);
            m.Put("CURRENT_ID___", 0);
            m.Put("COUNTER___", new ConcurrentDictionary <long, bool>());
            m.Put("PARA___", para);

            JobBuilder     job     = null;
            TriggerBuilder trigger = null;

            switch (type)
            {
            case JOB_TYPE.CRAWLER_NET:
            case JOB_TYPE.CRAWLER_CURL:
                job = JobBuilder.Create <JobCrawler>();
                break;

            case JOB_TYPE.API_JS:
                job = JobBuilder.Create <JobApiJS>();
                break;
            }

            if (job != null)
            {
                job     = job.WithIdentity(name, group_name).UsingJobData(m);
                trigger = TriggerBuilder.Create();

                if (!string.IsNullOrEmpty(schedule))
                {
                    trigger = trigger.WithSchedule(CronScheduleBuilder.CronSchedule(schedule));
                }
                trigger = trigger.StartNow();

                var j = job.Build();
                var t = trigger.Build();

                m_scheduler.ScheduleJob(j, t);

                m_job.TryAdd(name, j);
                m_trigger.TryAdd(name, t);

                m_scheduler.ScheduleJob(j, t).Wait();
                return(name);
            }

            return(string.Empty);
        }
Esempio n. 20
0
        /// <summary>
        /// 初始化并启动
        /// </summary>
        public void Startup()
        {
            Task.Run(async() => {
                NameValueCollection props = new NameValueCollection
                {
                    { "quartz.serializer.type", "binary" }
                };
                _factory   = new StdSchedulerFactory(props);
                _scheduler = await _factory.GetScheduler();
                _scheduler.Context.Add("IServiceProvider", _provider);
                await _scheduler.Start();

                //读取数据库中所有定时任务
                var tasks = await _service.GetListAsync(new Domain.Entity.System.TimedTaskSearch {
                    IsDeleted = false
                }, null);

                //加载程序集
                assemblies = tasks.Select(x => x.AssemblyName).Distinct().Select(name => AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(name))).ToList();

                foreach (var task in tasks.Where(x => x.Status != Domain.Enum.System.EmTimedTaskStatus.Disable && x.Status != Domain.Enum.System.EmTimedTaskStatus.Expired))
                {
                    //处理过期任务
                    if (task.ValidEndTime < DateTime.Now)
                    {
                        await _service.UpdateTaskStatusAsync(task.Id, new {
                            Status = Domain.Enum.System.EmTimedTaskStatus.Expired
                        });
                        continue;
                    }

                    var assembly = assemblies.FirstOrDefault(x => x.FullName.Split(',')[0].Equals(task.AssemblyName));
                    if (assembly == null)
                    {
                        //未正确加载程序集
                        await _service.UpdateTaskStatusAsync(task.Id, new
                        {
                            Status = Domain.Enum.System.EmTimedTaskStatus.Abnormal
                        });
                        continue;
                    }

                    var type = assembly.DefinedTypes.FirstOrDefault(x => x.FullName.Equals(task.TypeName));
                    if (type == null)
                    {
                        //未正确加载类型
                        await _service.UpdateTaskStatusAsync(task.Id, new
                        {
                            Status = Domain.Enum.System.EmTimedTaskStatus.Abnormal
                        });
                        continue;
                    }

                    // 定义一个 Job
                    IJobDetail job = JobBuilder.Create(type)
                                     .WithIdentity(task.Name, task.Group)
                                     .UsingJobData("TaskId", task.Id)
                                     .Build();

                    // 定义一个触发器
                    TriggerBuilder builder = TriggerBuilder.Create().WithIdentity(task.Name, task.Group);
                    if (task.ValidStartTime <= DateTime.Now)
                    {
                        builder = builder.StartNow();
                    }
                    else
                    {
                        builder = builder.StartAt(task.ValidStartTime);
                    }
                    builder = builder.EndAt(task.ValidEndTime);

                    //Cron
                    builder = builder.WithCronSchedule(task.Cron);

                    ITrigger trigger = builder.Build();

                    //加入Job
                    await _scheduler.ScheduleJob(job, trigger);
                }
            });
        }