Example #1
0
        private static IJob GetJob(string file, string jobName)
        {
            #region 加载文件信息
            var                      xml  = File.ReadAllText(file);
            XmlSerializer            xs   = new XmlSerializer(typeof(QuartzXmlConfiguration20));
            QuartzXmlConfiguration20 data = (QuartzXmlConfiguration20)xs.Deserialize(new StringReader(xml));

            List <jobdetailType> jobNodes = new List <jobdetailType>();
            if (data.schedule != null)
            {
                foreach (jobschedulingdataSchedule schedule in data.schedule)
                {
                    if (((schedule != null) ? schedule.job : null) != null)
                    {
                        jobNodes.AddRange(schedule.job);
                    }
                }
            }
            #endregion

            var node = jobNodes.FirstOrDefault(q => q.name.ToLower() == jobName.ToLower());
            if (node == null)
            {
                Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}]【{jobName}】任务不存在...");
                return(null);
            }
            var type = Type.GetType(node.jobtype);
            if (type == null)
            {
                Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}]【{jobName}】任务jobtype【{node.jobtype}】不存在...");
                return(null);
            }
            return(Activator.CreateInstance(Type.GetType(node.jobtype)) as IJob);
        }
Example #2
0
        public static void DeleteJob(string XMLFile, JobKey Job)
        {
            string fileName = FileUtil.ResolveFile(XMLFile);

            using (StreamReader sr = new StreamReader(fileName))
            {
                string                   xmlContent = sr.ReadToEnd();
                XmlSerializer            xs         = new XmlSerializer(typeof(QuartzXmlConfiguration20));
                QuartzXmlConfiguration20 data       = (QuartzXmlConfiguration20)xs.Deserialize(new StringReader(xmlContent));
                if (data.schedule.Length > 0)
                {
                    List <jobdetailType> jobdetailTypeList = new List <jobdetailType>();
                    if (data.schedule[0].job == null)
                    {
                        return;
                    }
                    jobdetailTypeList.AddRange(data.schedule[0].job);
                    for (int i = 0; i < jobdetailTypeList.Count; i++)
                    {
                        if ((jobdetailTypeList[i].name == Job.Name) && (jobdetailTypeList[i].group == Job.Group))
                        {
                            jobdetailTypeList.RemoveAt(i);
                            break;
                        }
                    }
                    data.schedule[0].job = jobdetailTypeList.ToArray();

                    List <triggerType> triggerTypeList = new List <triggerType>();
                    triggerTypeList.AddRange(data.schedule[0].trigger);
                    for (int i = triggerTypeList.Count - 1; i >= 0; i--)
                    {
                        if ((triggerTypeList[i].Item.jobname == Job.Name) && (triggerTypeList[i].Item.jobgroup == Job.Group))
                        {
                            triggerTypeList.RemoveAt(i);
                        }
                    }
                    data.schedule[0].trigger = triggerTypeList.ToArray();
                }
                sr.Close();
                StringBuilder xmlBuild = new StringBuilder();
                xs.Serialize(new StringWriter(xmlBuild), data);
                StreamWriter sw = new StreamWriter(fileName);

                sw.Write(xmlBuild.ToString());
                sw.Flush();
                sw.Close();
            }
        }
        protected virtual void ProcessInternal(string xml)
        {
            PrepForProcessing();

            ValidateXml(xml);
            MaybeThrowValidationException();

            // deserialize as object model
            XmlSerializer            xs   = new XmlSerializer(typeof(QuartzXmlConfiguration20));
            QuartzXmlConfiguration20 data = (QuartzXmlConfiguration20)xs.Deserialize(new StringReader(xml));

            if (data == null)
            {
                throw new SchedulerConfigException("Job definition data from XML was null after deserialization");
            }

            //
            // Extract pre-processing commands
            //
            if (data.preprocessingcommands != null)
            {
                foreach (preprocessingcommandsType command in data.preprocessingcommands)
                {
                    if (command.deletejobsingroup != null)
                    {
                        foreach (string s in command.deletejobsingroup)
                        {
                            string deleteJobGroup = s.NullSafeTrim();
                            if (!String.IsNullOrEmpty(deleteJobGroup))
                            {
                                jobGroupsToDelete.Add(deleteJobGroup);
                            }
                        }
                    }
                    if (command.deletetriggersingroup != null)
                    {
                        foreach (string s in command.deletetriggersingroup)
                        {
                            string deleteTriggerGroup = s.NullSafeTrim();
                            if (!String.IsNullOrEmpty(deleteTriggerGroup))
                            {
                                triggerGroupsToDelete.Add(deleteTriggerGroup);
                            }
                        }
                    }
                    if (command.deletejob != null)
                    {
                        foreach (preprocessingcommandsTypeDeletejob s in command.deletejob)
                        {
                            string name  = s.name.TrimEmptyToNull();
                            string group = s.group.TrimEmptyToNull();

                            if (name == null)
                            {
                                throw new SchedulerConfigException("Encountered a 'delete-job' command without a name specified.");
                            }
                            jobsToDelete.Add(new JobKey(name, group));
                        }
                    }
                    if (command.deletetrigger != null)
                    {
                        foreach (preprocessingcommandsTypeDeletetrigger s in command.deletetrigger)
                        {
                            string name  = s.name.TrimEmptyToNull();
                            string group = s.group.TrimEmptyToNull();

                            if (name == null)
                            {
                                throw new SchedulerConfigException("Encountered a 'delete-trigger' command without a name specified.");
                            }
                            triggersToDelete.Add(new TriggerKey(name, group));
                        }
                    }
                }
            }

            if (log.IsDebugEnabled)
            {
                log.Debug("Found " + jobGroupsToDelete.Count + " delete job group commands.");
                log.Debug("Found " + triggerGroupsToDelete.Count + " delete trigger group commands.");
                log.Debug("Found " + jobsToDelete.Count + " delete job commands.");
                log.Debug("Found " + triggersToDelete.Count + " delete trigger commands.");
            }

            //
            // Extract directives
            //
            if (data.processingdirectives != null && data.processingdirectives.Length > 0)
            {
                bool overWrite = data.processingdirectives[0].overwriteexistingdata;
                log.Debug("Directive 'overwrite-existing-data' specified as: " + overWrite);
                OverWriteExistingData = overWrite;
            }
            else
            {
                log.Debug("Directive 'overwrite-existing-data' not specified, defaulting to " + OverWriteExistingData);
            }

            if (data.processingdirectives != null && data.processingdirectives.Length > 0)
            {
                bool ignoreduplicates = data.processingdirectives[0].ignoreduplicates;
                log.Debug("Directive 'ignore-duplicates' specified as: " + ignoreduplicates);
                IgnoreDuplicates = ignoreduplicates;
            }
            else
            {
                log.Debug("Directive 'ignore-duplicates' not specified, defaulting to " + IgnoreDuplicates);
            }

            if (data.processingdirectives != null && data.processingdirectives.Length > 0)
            {
                bool scheduleRelative = data.processingdirectives[0].scheduletriggerrelativetoreplacedtrigger;
                log.Debug("Directive 'schedule-trigger-relative-to-replaced-trigger' specified as: " + scheduleRelative);
                ScheduleTriggerRelativeToReplacedTrigger = scheduleRelative;
            }
            else
            {
                log.Debug("Directive 'schedule-trigger-relative-to-replaced-trigger' not specified, defaulting to " + ScheduleTriggerRelativeToReplacedTrigger);
            }

            //
            // Extract Job definitions...
            //
            List <jobdetailType> jobNodes = new List <jobdetailType>();

            if (data.schedule != null)
            {
                foreach (var schedule in data.schedule)
                {
                    if (schedule != null)
                    {
                        if (schedule.job != null)
                        {
                            jobNodes.AddRange(schedule.job);
                        }
                    }
                }
            }

            log.Debug("Found " + jobNodes.Count + " job definitions.");

            foreach (jobdetailType jobDetailType in jobNodes)
            {
                string jobName              = jobDetailType.name.TrimEmptyToNull();
                string jobGroup             = jobDetailType.group.TrimEmptyToNull();
                string jobDescription       = jobDetailType.description.TrimEmptyToNull();
                string jobTypeName          = jobDetailType.jobtype.TrimEmptyToNull();
                bool   jobDurability        = jobDetailType.durable;
                bool   jobRecoveryRequested = jobDetailType.recover;

                Type jobType = typeLoadHelper.LoadType(jobTypeName);


                IJobDetail jobDetail = JobBuilder.Create(jobType)
                                       .WithIdentity(jobName, jobGroup)
                                       .WithDescription(jobDescription)
                                       .StoreDurably(jobDurability)
                                       .RequestRecovery(jobRecoveryRequested)
                                       .Build();

                if (jobDetailType.jobdatamap != null && jobDetailType.jobdatamap.entry != null)
                {
                    foreach (entryType entry in jobDetailType.jobdatamap.entry)
                    {
                        string key   = entry.key.TrimEmptyToNull();
                        string value = entry.value.TrimEmptyToNull();
                        jobDetail.JobDataMap.Add(key, value);
                    }
                }

                if (log.IsDebugEnabled)
                {
                    log.Debug("Parsed job definition: " + jobDetail);
                }

                AddJobToSchedule(jobDetail);
            }

            //
            // Extract Trigger definitions...
            //

            List <triggerType> triggerEntries = new List <triggerType>();

            if (data.schedule != null)
            {
                foreach (var schedule in data.schedule)
                {
                    if (schedule != null && schedule.trigger != null)
                    {
                        triggerEntries.AddRange(schedule.trigger);
                    }
                }
            }

            log.Debug("Found " + triggerEntries.Count + " trigger definitions.");

            foreach (triggerType triggerNode in triggerEntries)
            {
                string triggerName        = triggerNode.Item.name.TrimEmptyToNull();
                string triggerGroup       = triggerNode.Item.group.TrimEmptyToNull();
                string triggerDescription = triggerNode.Item.description.TrimEmptyToNull();
                string triggerCalendarRef = triggerNode.Item.calendarname.TrimEmptyToNull();
                string triggerJobName     = triggerNode.Item.jobname.TrimEmptyToNull();
                string triggerJobGroup    = triggerNode.Item.jobgroup.TrimEmptyToNull();

                int triggerPriority = TriggerConstants.DefaultPriority;
                if (!triggerNode.Item.priority.IsNullOrWhiteSpace())
                {
                    triggerPriority = Convert.ToInt32(triggerNode.Item.priority);
                }

                DateTimeOffset triggerStartTime = SystemTime.UtcNow();
                if (triggerNode.Item.Item != null)
                {
                    if (triggerNode.Item.Item is DateTime)
                    {
                        triggerStartTime = new DateTimeOffset((DateTime)triggerNode.Item.Item);
                    }
                    else
                    {
                        triggerStartTime = triggerStartTime.AddSeconds(Convert.ToInt32(triggerNode.Item.Item));
                    }
                }

                DateTime?triggerEndTime = triggerNode.Item.endtimeSpecified ? triggerNode.Item.endtime : (DateTime?)null;

                IScheduleBuilder sched;

                if (triggerNode.Item is simpleTriggerType)
                {
                    simpleTriggerType simpleTrigger        = (simpleTriggerType)triggerNode.Item;
                    string            repeatCountString    = simpleTrigger.repeatcount.TrimEmptyToNull();
                    string            repeatIntervalString = simpleTrigger.repeatinterval.TrimEmptyToNull();

                    int      repeatCount    = ParseSimpleTriggerRepeatCount(repeatCountString);
                    TimeSpan repeatInterval = repeatIntervalString == null ? TimeSpan.Zero : TimeSpan.FromMilliseconds(Convert.ToInt64(repeatIntervalString));

                    sched = SimpleScheduleBuilder.Create()
                            .WithInterval(repeatInterval)
                            .WithRepeatCount(repeatCount);

                    if (!simpleTrigger.misfireinstruction.IsNullOrWhiteSpace())
                    {
                        ((SimpleScheduleBuilder)sched).WithMisfireHandlingInstruction(ReadMisfireInstructionFromString(simpleTrigger.misfireinstruction));
                    }
                }
                else if (triggerNode.Item is cronTriggerType)
                {
                    cronTriggerType cronTrigger    = (cronTriggerType)triggerNode.Item;
                    string          cronExpression = cronTrigger.cronexpression.TrimEmptyToNull();
                    string          timezoneString = cronTrigger.timezone.TrimEmptyToNull();

                    TimeZoneInfo tz = timezoneString != null?TimeZoneInfo.FindSystemTimeZoneById(timezoneString) : null;

                    sched = CronScheduleBuilder.CronSchedule(cronExpression)
                            .InTimeZone(tz);

                    if (!cronTrigger.misfireinstruction.IsNullOrWhiteSpace())
                    {
                        ((CronScheduleBuilder)sched).WithMisfireHandlingInstruction(ReadMisfireInstructionFromString(cronTrigger.misfireinstruction));
                    }
                }
                else if (triggerNode.Item is calendarIntervalTriggerType)
                {
                    calendarIntervalTriggerType calendarIntervalTrigger = (calendarIntervalTriggerType)triggerNode.Item;
                    string repeatIntervalString = calendarIntervalTrigger.repeatinterval.TrimEmptyToNull();

                    IntervalUnit intervalUnit   = ParseDateIntervalTriggerIntervalUnit(calendarIntervalTrigger.repeatintervalunit.TrimEmptyToNull());
                    int          repeatInterval = repeatIntervalString == null ? 0 : Convert.ToInt32(repeatIntervalString);

                    sched = CalendarIntervalScheduleBuilder.Create()
                            .WithInterval(repeatInterval, intervalUnit);

                    if (!calendarIntervalTrigger.misfireinstruction.IsNullOrWhiteSpace())
                    {
                        ((CalendarIntervalScheduleBuilder)sched).WithMisfireHandlingInstruction(ReadMisfireInstructionFromString(calendarIntervalTrigger.misfireinstruction));
                    }
                }
                else
                {
                    throw new SchedulerConfigException("Unknown trigger type in XML configuration");
                }

                IMutableTrigger trigger = (IMutableTrigger)TriggerBuilder.Create()
                                          .WithIdentity(triggerName, triggerGroup)
                                          .WithDescription(triggerDescription)
                                          .ForJob(triggerJobName, triggerJobGroup)
                                          .StartAt(triggerStartTime)
                                          .EndAt(triggerEndTime)
                                          .WithPriority(triggerPriority)
                                          .ModifiedByCalendar(triggerCalendarRef)
                                          .WithSchedule(sched)
                                          .Build();

                if (triggerNode.Item.jobdatamap != null && triggerNode.Item.jobdatamap.entry != null)
                {
                    foreach (entryType entry in triggerNode.Item.jobdatamap.entry)
                    {
                        string key   = entry.key.TrimEmptyToNull();
                        string value = entry.value.TrimEmptyToNull();
                        trigger.JobDataMap.Add(key, value);
                    }
                }

                if (log.IsDebugEnabled)
                {
                    log.Debug("Parsed trigger definition: " + trigger);
                }

                AddTriggerToSchedule(trigger);
            }
        }
Example #4
0
        private static void TestJob(string file)
        {
            Console.WriteLine("----------- 检测文件配置 START -------------");

            #region 加载文件信息
            var                      xml  = File.ReadAllText(file);
            XmlSerializer            xs   = new XmlSerializer(typeof(QuartzXmlConfiguration20));
            QuartzXmlConfiguration20 data = (QuartzXmlConfiguration20)xs.Deserialize(new StringReader(xml));

            List <jobdetailType>   jobNodes     = new List <jobdetailType>();
            List <cronTriggerType> triggerTypes = new List <cronTriggerType>();
            if (data.schedule != null)
            {
                foreach (jobschedulingdataSchedule schedule in data.schedule)
                {
                    if (schedule?.job != null)
                    {
                        jobNodes.AddRange(schedule.job);
                    }
                }
                foreach (jobschedulingdataSchedule schedule2 in data.schedule)
                {
                    if (schedule2?.trigger != null)
                    {
                        foreach (var item in schedule2.trigger)
                        {
                            cronTriggerType cronTrigger = item.Item as cronTriggerType;
                            if (cronTrigger == null)
                            {
                                continue;
                            }
                            triggerTypes.Add(cronTrigger);
                        }
                    }
                }
            }
            #endregion

            #region 检测 jobtype
            if (jobNodes.Count == 0)
            {
                Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}] 没有可执行任务!");
            }
            else
            {
                foreach (var node in jobNodes)
                {
                    var type = Type.GetType(node.jobtype);
                    if (type == null)
                    {
                        Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}]jobtype【{node.jobtype}】出错了...");
                    }
                    else
                    {
                        Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}]job【{node.name}】检测成功...");
                    }
                }
            }
            #endregion

            #region 检测 trigger
            if (triggerTypes.Count == 0)
            {
                Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}] 没有配置trigger!");
            }
            else
            {
                foreach (var node in triggerTypes)
                {
                    const string reg = @"^(((([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?,)*([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?)|(([\*]|[0-9]|[0-5][0-9])/([0-9]|[0-5][0-9]))|([\?])|([\*]))[\s](((([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?,)*([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?)|(([\*]|[0-9]|[0-5][0-9])/([0-9]|[0-5][0-9]))|([\?])|([\*]))[\s](((([0-9]|[0-1][0-9]|[2][0-3])(-([0-9]|[0-1][0-9]|[2][0-3]))?,)*([0-9]|[0-1][0-9]|[2][0-3])(-([0-9]|[0-1][0-9]|[2][0-3]))?)|(([\*]|[0-9]|[0-1][0-9]|[2][0-3])/([0-9]|[0-1][0-9]|[2][0-3]))|([\?])|([\*]))[\s](((([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(-([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1]))?,)*([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(-([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1]))?(C)?)|(([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])/([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(C)?)|(L(-[0-9])?)|(L(-[1-2][0-9])?)|(L(-[3][0-1])?)|(LW)|([1-9]W)|([1-3][0-9]W)|([\?])|([\*]))[\s](((([1-9]|0[1-9]|1[0-2])(-([1-9]|0[1-9]|1[0-2]))?,)*([1-9]|0[1-9]|1[0-2])(-([1-9]|0[1-9]|1[0-2]))?)|(([1-9]|0[1-9]|1[0-2])/([1-9]|0[1-9]|1[0-2]))|(((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?,)*(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?)|((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)/(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))|([\?])|([\*]))[\s]((([1-7](-([1-7]))?,)*([1-7])(-([1-7]))?)|([1-7]/([1-7]))|(((MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?,)*(MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?(C)?)|((MON|TUE|WED|THU|FRI|SAT|SUN)/(MON|TUE|WED|THU|FRI|SAT|SUN)(C)?)|(([1-7]|(MON|TUE|WED|THU|FRI|SAT|SUN))?(L|LW)?)|(([1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)#([1-7])?)|([\?])|([\*]))([\s]?(([\*])?|(19[7-9][0-9])|(20[0-9][0-9]))?| (((19[7-9][0-9])|(20[0-9][0-9]))/((19[7-9][0-9])|(20[0-9][0-9])))?| ((((19[7-9][0-9])|(20[0-9][0-9]))(-((19[7-9][0-9])|(20[0-9][0-9])))?,)*((19[7-9][0-9])|(20[0-9][0-9]))(-((19[7-9][0-9])|(20[0-9][0-9])))?)?)$";
                    var          m   = Regex.Match(node.cronexpression, reg);
                    if (m.Success)
                    {
                        Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}]trigger【{node.name}】检测成功...");
                    }
                    else
                    {
                        Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}]trigger【{node.name}】出错了...");
                    }
                }
            }
            #endregion

            Console.WriteLine("----------- 检测文件配置 END -------------");
        }
Example #5
0
        public static List <JobInfo> GetJobInfos(string file)
        {
            List <JobInfo> jobInfos = new List <JobInfo>();

            if (System.IO.File.Exists(file) == false)
            {
                return(jobInfos);
            }
            var xmlFile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(file), "quartz_jobs.xml");

            if (System.IO.File.Exists(xmlFile) == false)
            {
                return(jobInfos);
            }
            var                      xml  = System.IO.File.ReadAllText(xmlFile);
            XmlSerializer            xs   = new XmlSerializer(typeof(QuartzXmlConfiguration20));
            QuartzXmlConfiguration20 data = (QuartzXmlConfiguration20)xs.Deserialize(new StringReader(xml));

            List <jobdetailType> jobNodes = new List <jobdetailType>();

            if (data.schedule != null)
            {
                foreach (jobschedulingdataSchedule schedule in data.schedule)
                {
                    if (((schedule != null) ? schedule.job : null) != null)
                    {
                        jobNodes.AddRange(schedule.job);
                    }
                }
            }
            List <triggerType> triggerEntries = new List <triggerType>();

            if (data.schedule != null)
            {
                foreach (jobschedulingdataSchedule schedule2 in data.schedule)
                {
                    if (schedule2 != null && schedule2.trigger != null)
                    {
                        triggerEntries.AddRange(schedule2.trigger);
                    }
                }
            }

            foreach (var item in jobNodes)
            {
                var list = triggerEntries.Where(q => q.Item.jobgroup == item.group && q.Item.jobname == item.name).ToList();
                foreach (var trigger in list)
                {
                    if (trigger.Item is cronTriggerType)
                    {
                        cronTriggerType cronTrigger    = (cronTriggerType)trigger.Item;
                        string          cronExpression = cronTrigger.cronexpression.Trim();
                        if (CronExpression.IsValidExpression(cronExpression) == false)
                        {
                        }
                        else
                        {
                            var cron = CronExpressionDescriptor.ExpressionDescriptor.GetDescription(cronExpression, new CronExpressionDescriptor.Options()
                            {
                                DayOfWeekStartIndexZero = false,
                                Use24HourTimeFormat     = true,
                            });
                            jobInfos.Add(new JobInfo()
                            {
                                Name                     = item.name,
                                TriggerName              = cronTrigger.name,
                                TriggerGroup             = cronTrigger.group,
                                Description              = item.description,
                                CronExpressionDescriptor = cron,
                                Cron                     = cronExpression,
                                NextStartTime            = GetTaskeFireTime(cronExpression, 1)[0]
                            });
                        }
                    }
                }
            }
            return(jobInfos);
        }
Example #6
0
        public static bool SaveJob(string serviceName, string jobName, string description, string triggerGroup, string triggerName, string cron, out string msg)
        {
            //if (Session[SessionAdmin] == null) return Json(new { code = 0, date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), msg = "请登录!" }, JsonRequestBehavior.AllowGet);
            description = description.Trim();
            if (string.IsNullOrWhiteSpace(description))
            {
                msg = "Job名称不能为空";
                return(false);
            }
            cron = cron.Trim();
            #region 判断Cron表达式
            if (CronExpression.IsValidExpression(cron) == false)
            {
                msg = "Cron表达式错误";
                return(false);
            }
            else
            {
                try {
                    CronExpressionDescriptor.ExpressionDescriptor.GetDescription(cron, new CronExpressionDescriptor.Options()
                    {
                        DayOfWeekStartIndexZero = false,
                        Use24HourTimeFormat     = true,
                    });
                    GetTaskeFireTime(cron, 1);
                } catch (Exception) {
                    msg = "Cron表达式错误";
                    return(false);
                }
            }
            #endregion


            #region  务判断
            var info = GetServiceInfo(serviceName, false, false);
            if (info == null)
            {
                msg = $"服务【{serviceName}】不存在!";
                return(false);
            }
            #endregion
            #region 文件判断
            var xmlFile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(info.Path), "quartz_jobs.xml");
            if (System.IO.File.Exists(xmlFile) == false)
            {
                msg = $"服务【{serviceName}】配置文件不存在!";
                return(false);
            }
            #endregion
            #region 保存数据
            var                      xml  = System.IO.File.ReadAllText(xmlFile);
            XmlSerializer            xs   = new XmlSerializer(typeof(QuartzXmlConfiguration20));
            QuartzXmlConfiguration20 data = (QuartzXmlConfiguration20)xs.Deserialize(new StringReader(xml));
            if (data.schedule != null)
            {
                foreach (jobschedulingdataSchedule schedule in data.schedule)
                {
                    if (((schedule != null) ? schedule.job : null) != null)
                    {
                        foreach (var item in schedule.job)
                        {
                            if (item.name == jobName)
                            {
                                item.description = description;
                            }
                        }
                    }
                }
                foreach (jobschedulingdataSchedule schedule2 in data.schedule)
                {
                    if (schedule2 != null && schedule2.trigger != null)
                    {
                        foreach (var item in schedule2.trigger)
                        {
                            cronTriggerType cronTrigger = item.Item as cronTriggerType;
                            if (cronTrigger == null)
                            {
                                continue;
                            }
                            if (cronTrigger.group == triggerGroup && cronTrigger.name == triggerName)
                            {
                                cronTrigger.cronexpression = cron;
                            }
                        }
                    }
                }
            }
            #endregion
            #region 保存文件
            xml = Serializer(typeof(QuartzXmlConfiguration20), data);
            System.IO.File.Copy(xmlFile, xmlFile + DateTime.Now.ToString("_yyyyMMdd_HHmmss") + ".bak", true);
            System.IO.File.WriteAllText(xmlFile, xml);
            #endregion
            msg = $"操作成功,请注意重启!";
            return(true);
        }
Example #7
0
        public static int GetJob(string file, string jobName)
        {
            if (System.IO.File.Exists(file) == false)
            {
                return(0);
            }
            var xmlFile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(file), "quartz_jobs.xml");

            if (System.IO.File.Exists(xmlFile) == false)
            {
                return(0);
            }
            var                      xml  = System.IO.File.ReadAllText(xmlFile);
            XmlSerializer            xs   = new XmlSerializer(typeof(QuartzXmlConfiguration20));
            QuartzXmlConfiguration20 data = (QuartzXmlConfiguration20)xs.Deserialize(new StringReader(xml));

            List <jobdetailType> jobNodes = new List <jobdetailType>();

            if (data.schedule != null)
            {
                foreach (jobschedulingdataSchedule schedule in data.schedule)
                {
                    if (((schedule != null) ? schedule.job : null) != null)
                    {
                        jobNodes.AddRange(schedule.job);
                    }
                }
            }
            var node = jobNodes.FirstOrDefault(q => q.name.ToLower() == jobName.ToLower());

            if (node == null)
            {
                return(0);
            }

            List <triggerType> triggerEntries = new List <triggerType>();

            if (data.schedule != null)
            {
                foreach (jobschedulingdataSchedule schedule2 in data.schedule)
                {
                    if (schedule2 != null && schedule2.trigger != null)
                    {
                        triggerEntries.AddRange(schedule2.trigger);
                    }
                }
            }

            var list = triggerEntries.Where(q => q.Item.jobgroup == node.group && q.Item.jobname == node.name).ToList();

            foreach (var trigger in list)
            {
                if (trigger.Item is cronTriggerType)
                {
                    cronTriggerType cronTrigger    = (cronTriggerType)trigger.Item;
                    string          cronExpression = cronTrigger.cronexpression.Trim();
                    if (CronExpression.IsValidExpression(cronExpression) == false)
                    {
                    }
                    else
                    {
                        if (RunJobLately(cronExpression))
                        {
                            return(2);
                        }
                    }
                }
            }

            return(1);
        }
Example #8
0
        public static void AddJob(string XMLFile, IJobDetail JobDetail, ITrigger Trigger)
        {
            string fileName = FileUtil.ResolveFile(XMLFile);

            using (StreamReader sr = new StreamReader(fileName))
            {
                string                   xmlContent = sr.ReadToEnd();
                XmlSerializer            xs         = new XmlSerializer(typeof(QuartzXmlConfiguration20));
                QuartzXmlConfiguration20 data       = (QuartzXmlConfiguration20)xs.Deserialize(new StringReader(xmlContent));
                if (data.schedule.Length > 0)
                {
                    //将IJobDetail添加到XML中的JobDetailType中
                    jobdetailType[] newJobDetails;
                    if (data.schedule[0].job == null)
                    {
                        newJobDetails = new jobdetailType[1];
                    }
                    else
                    {
                        newJobDetails = new jobdetailType[data.schedule[0].job.Length + 1];
                        data.schedule[0].job.CopyTo(newJobDetails, 0);
                    }

                    jobdetailType type = new jobdetailType();
                    type.name        = JobDetail.Key.Name;
                    type.group       = JobDetail.Key.Group;
                    type.description = JobDetail.Description;
                    type.jobtype     = JobDetail.JobType.AssemblyQualifiedName;
                    type.durable     = JobDetail.Durable;;
                    type.recover     = JobDetail.RequestsRecovery;
                    newJobDetails[newJobDetails.Length - 1] = type;
                    data.schedule[0].job = newJobDetails;
                    if (JobDetail.JobDataMap.Count > 0)
                    {
                        type.jobdatamap       = new jobdatamapType();
                        type.jobdatamap.entry = new entryType[JobDetail.JobDataMap.Count];
                        IList <string> keys = JobDetail.JobDataMap.GetKeys();

                        int i = 0;
                        foreach (string item in keys)
                        {
                            type.jobdatamap.entry[i]       = new entryType();
                            type.jobdatamap.entry[i].key   = item;
                            type.jobdatamap.entry[i].value = JobDetail.JobDataMap[item].ToString();
                            i++;
                        }
                    }
                    triggerType[] newTriggerTypes;
                    if (data.schedule[0].trigger != null)
                    {
                        newTriggerTypes = new triggerType[data.schedule[0].trigger.Length + 1];
                        data.schedule[0].trigger.CopyTo(newTriggerTypes, 0);
                    }
                    else
                    {
                        newTriggerTypes = new triggerType[1];
                    }

                    triggerType tType = new triggerType();
                    if (Trigger is ISimpleTrigger)
                    {
                        tType.Item = new simpleTriggerType();
                        ((simpleTriggerType)tType.Item).repeatcount        = (Trigger as ISimpleTrigger).RepeatCount.ToString();
                        ((simpleTriggerType)tType.Item).repeatinterval     = (Trigger as ISimpleTrigger).RepeatInterval.TotalMilliseconds.ToString();
                        ((simpleTriggerType)tType.Item).jobname            = JobDetail.Key.Name;
                        ((simpleTriggerType)tType.Item).jobgroup           = JobDetail.Key.Group;
                        ((simpleTriggerType)tType.Item).name               = Trigger.Key.Name;
                        ((simpleTriggerType)tType.Item).group              = Trigger.Key.Group;
                        ((simpleTriggerType)tType.Item).description        = Trigger.Description;
                        ((simpleTriggerType)tType.Item).misfireinstruction = "RescheduleNowWithExistingRepeatCount";
                    }
                    else
                    {
                        tType.Item = new cronTriggerType();
                        ((cronTriggerType)tType.Item).cronexpression = (Trigger as ICronTrigger).CronExpressionString.ToString();

                        ((simpleTriggerType)tType.Item).jobname            = JobDetail.Key.Name;
                        ((simpleTriggerType)tType.Item).jobgroup           = JobDetail.Key.Group;
                        ((simpleTriggerType)tType.Item).name               = Trigger.Key.Name;
                        ((simpleTriggerType)tType.Item).group              = Trigger.Key.Group;
                        ((simpleTriggerType)tType.Item).description        = Trigger.Description;
                        ((simpleTriggerType)tType.Item).misfireinstruction = "RescheduleNowWithExistingRepeatCount";
                    }

                    newTriggerTypes[newTriggerTypes.Length - 1] = tType;
                    data.schedule[0].trigger = newTriggerTypes;
                }
                sr.Close();
                StringBuilder xmlBuild = new StringBuilder();
                xs.Serialize(new StringWriter(xmlBuild), data);
                StreamWriter sw = new StreamWriter(fileName);

                sw.Write(xmlBuild.ToString());
                sw.Flush();
                sw.Close();
            }
        }