コード例 #1
0
ファイル: JobScheduler.cs プロジェクト: radtek/QuartService
 /// <summary>
 /// Loads all jobs from SQLDB into a template List
 /// </summary>
 private void loadJobsFromDB()
 {
     templates = new List <JobTemplate>();
     try
     {
         DBJob        dbJob      = new DBJob();
         var          dbJobQuery = from job in db.Jobs select job;
         List <DBJob> dbJobs     = dbJobQuery.ToList();
         if (dbJobs != null)
         {
             foreach (DBJob job in dbJobs)
             {
                 JobTemplate template = new JobTemplate();
                 template.ID    = job.JobId;
                 template.Name  = job.JobName;
                 template.Group = job.JobGroup;
                 template.processPathStringsFromDB(job.Process, job.WorkingDirectory);
                 template.Arguments        = job.Arguments;
                 template.WorkingDirectory = job.WorkingDirectory;
                 template.CronSchedule     = job.CronSchedule;
                 template.Timeout          = job.TimeOut.ToString();
                 templates.Add(template);
             }
         }
     }
     catch (Exception ex)
     {
         QuartzService.log("Error loading Jobs from DB: " + "Exception\n" + ex.StackTrace);
     }
 }
コード例 #2
0
        /// <summary>
        /// Updates SQLDB from incoming folder JSON files
        /// </summary>
        /// <returns>Dictionary with Template keys and values indicating the update types</returns>
        public Dictionary <JobTemplate, UpdateType> updateFromIncoming()
        {
            Dictionary <JobTemplate, UpdateType> jobIDs = null;

            QuartzService.log("Checking for any incoming updates");
            try
            {
                List <String> filePaths = new List <String>(Directory.GetFiles(strIncomingDirectory));
                if (filePaths.Count > 0)
                {
                    QuartzService.log("Running incoming updates");
                    jobIDs = new Dictionary <JobTemplate, UpdateType>();
                    sortIncomingFiles(filePaths);
                    for (int i = 0; i < filePaths.Count; i++)
                    {
                        if (filePaths[i].EndsWith(".json", StringComparison.CurrentCultureIgnoreCase))
                        {
                            try
                            {
                                JobTemplate template = JsonConvert.DeserializeObject <JobTemplate>(File.ReadAllText(filePaths[i]));
                                try
                                {
                                    UpdateType updateType = updateDatabase(template);
                                    QuartzService.log("Job ID " + template.ID + " set to update in DB");
                                    db.SaveChanges();
                                    QuartzService.log("Job ID " + template.ID + " changes saved to the DB");
                                    jobIDs.Add(template, updateType);
                                    try
                                    {
                                        File.Delete(filePaths[i]);
                                    }
                                    catch (Exception ex)
                                    {
                                        QuartzService.log("Error deleting JSON file after update Exception\n" + ex.StackTrace);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    QuartzService.log("Error updating the DB Exception\n" + ex.InnerException + "\n" + ex.StackTrace);
                                }
                            }
                            catch (Exception ex)
                            {
                                renameToERR(filePaths[i]);
                                QuartzService.log("Error updating from " + filePaths[i] + "\n" + ex.StackTrace);
                            }
                        }
                    }
                }
                else
                {
                    QuartzService.log("No Updates Found");
                }
            }
            catch (Exception ex)
            {
                QuartzService.log("Error loading files from " + strIncomingDirectory + "Exception\n" + ex.StackTrace);
            }
            return(jobIDs);
        }
コード例 #3
0
ファイル: JobScheduler.cs プロジェクト: radtek/QuartService
        /// <summary>
        /// Schedules the jobs in the template list
        /// </summary>
        private void setUpJobs()
        {
            foreach (JobTemplate template in templates)
            {
                try
                {
                    IJobDetail job = JobBuilder.Create <Job>().Build();
                    job.JobDataMap["ID"]   = template.ID.ToString();
                    job.JobDataMap["Name"] = template.Name;
                    //job.JobDataMap["Group"] = template.Group;
                    //Defaulting all to "Default" group for now
                    job.JobDataMap["Group"]        = "Default";
                    job.JobDataMap["Process"]      = template.Process;
                    job.JobDataMap["Arguments"]    = template.Arguments;
                    job.JobDataMap["CronSchedule"] = template.CronSchedule;
                    job.JobDataMap["TimeOut"]      = template.Timeout;

                    ITrigger trigger = TriggerBuilder.Create()
                                       .WithIdentity(job.JobDataMap["ID"].ToString(), job.JobDataMap["Group"].ToString())
                                       .WithCronSchedule(job.JobDataMap["CronSchedule"].ToString())
                                       .StartAt(DateTime.UtcNow)
                                       .WithPriority(1)
                                       .Build();

                    scheduler.ScheduleJob(job, trigger);
                    QuartzService.log("Job ID " + template.ID + " has been scheduled");
                }
                catch (Exception ex)
                {
                    QuartzService.log("Error scheduling " + template.Name + "\n" + ex.StackTrace);
                }
            }
        }
コード例 #4
0
ファイル: JobScheduler.cs プロジェクト: radtek/QuartService
        /// <summary>
        /// Removes a single job from scheduler by JobID
        /// </summary>
        /// <param name="jobID">Job ID to be removed</param>
        public void removeJobFromScheduler(String jobID)
        {
            IList <string> jobGroups    = scheduler.GetJobGroupNames();
            var            groupMatcher = GroupMatcher <JobKey> .GroupContains(jobGroups[0]);

            var jobKeys = scheduler.GetJobKeys(groupMatcher);

            foreach (JobKey jobKey in jobKeys)
            {
                var    detail = scheduler.GetJobDetail(jobKey);
                String strID  = detail.JobDataMap.GetString("ID");
                if (strID == jobID)
                {
                    try
                    {
                        scheduler.DeleteJob(jobKey);
                        QuartzService.log("Job ID " + jobID + " has been unscheduled");
                    }
                    catch (Exception ex)
                    {
                        QuartzService.log("Error removing job " + jobID + " from scheduler \n" + ex);
                    }
                    break;
                }
            }
        }
コード例 #5
0
ファイル: QuartzService.cs プロジェクト: radtek/QuartService
        public Boolean UpdateJobs(List <int> jobs)
        {
            bool Successful = false;

            try
            {
                String[] jobIDs = QuartzService.scheduler.getAllJobIDS();
                foreach (var job in jobs)
                {
                    if (jobIDs.Contains(job.ToString()))
                    {
                        QuartzService.scheduler.removeJobFromScheduler(job.ToString());
                        JobTemplate temp = QuartzService.scheduler.loadJobFromDB(job.ToString());
                        if (temp.ID > 0)
                        {
                            QuartzService.scheduler.setUpJob(QuartzService.scheduler.loadJobFromDB(job.ToString()));
                        }
                    }
                    else
                    {
                        QuartzService.scheduler.setUpJob(QuartzService.scheduler.loadJobFromDB(job.ToString()));
                    }
                }
            }
            catch (Exception ex)
            {
                QuartzService.log("Error Updating jobs thru IJobupdater " + "\n" + ex.StackTrace);
            }
            return(Successful);
        }
コード例 #6
0
ファイル: JobScheduler.cs プロジェクト: radtek/QuartService
        /// <summary>
        /// Loads and schedules jobs from JSON files in Jobs directory
        /// </summary>
        private void loadAndScheduleJobsFromFiles()
        {
            List <JobTemplate> fileTemplates = new List <JobTemplate>();

            String[] filepaths = Directory.GetFiles(strJobsDirectory);

            foreach (String file in filepaths)
            {
                try
                {
                    JobTemplate template = JsonConvert.DeserializeObject <JobTemplate>(File.ReadAllText(file));
                    fileTemplates.Add(template);
                    QuartzService.log(file + " file loaded successfully...");
                }
                catch (Exception ex)
                {
                    QuartzService.log("Error loading " + file + "\n" + ex.StackTrace);
                }
            }

            foreach (JobTemplate template in fileTemplates)
            {
                try
                {
                    IJobDetail job = JobBuilder.Create <Job>().Build();
                    job.JobDataMap["ID"]   = template.ID.ToString();
                    job.JobDataMap["Name"] = template.Name;
                    //job.JobDataMap["Group"] = template.Group;
                    //Defaulting all to "Default" group for now
                    job.JobDataMap["Group"]        = "Default";
                    job.JobDataMap["Process"]      = template.Process;
                    job.JobDataMap["Arguments"]    = template.Arguments;
                    job.JobDataMap["CronSchedule"] = template.CronSchedule;
                    job.JobDataMap["TimeOut"]      = template.Timeout;

                    ITrigger trigger = TriggerBuilder.Create()
                                       .WithIdentity(job.JobDataMap["ID"].ToString(), job.JobDataMap["Group"].ToString())
                                       .WithCronSchedule(job.JobDataMap["CronSchedule"].ToString())
                                       .StartAt(DateTime.UtcNow)
                                       .WithPriority(1)
                                       .Build();

                    scheduler.ScheduleJob(job, trigger);
                    QuartzService.log("Job ID " + template.ID + " has been scheduled");
                }
                catch (Exception ex)
                {
                    QuartzService.log("Error scheduling " + template.Name + "\n" + ex.StackTrace);
                }
            }
        }
コード例 #7
0
ファイル: Program.cs プロジェクト: radtek/QuartService
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
                        #if (!DEBUG)
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new QuartzService()
            };
            ServiceBase.Run(ServicesToRun);
                        #else
            QuartzService myServ = new QuartzService();
            myServ.onStartMethod();
#endif
        }
コード例 #8
0
        public int addNewRecord(int JobID, String JobName, DateTime startTime)
        {
            int       iRecordID = 0;
            JobRecord jobRecord = new JobRecord();

            try
            {
                jobRecord.JobId     = JobID;
                jobRecord.JobName   = JobName;
                jobRecord.BeginTime = startTime;
                db.JobRecords.Add(jobRecord);
                db.SaveChanges();
                iRecordID = jobRecord.RecordId;
            }
            catch (Exception ex)
            {
                QuartzService.log("Error adding job record for JobID " + JobID + " to the JobRecords DB\n" + ex);
            }
            return(iRecordID);
        }
コード例 #9
0
        /// <summary>
        /// Executes the JOB
        /// </summary>
        /// <param name="context"></param>
        public void Execute(IJobExecutionContext context)
        {
            JobDataMap datamap = context.JobDetail.JobDataMap;

            iID                 = datamap.GetInt("ID");
            strName             = datamap.GetString("Name");
            strProcess          = datamap.GetString("Process");
            strArguments        = datamap.GetString("Arguments");
            strWorkingDirectory = datamap.GetString("WorkingDirectory");
            iTimeOut            = datamap.GetInt("TimeOut");

            QuartzService.log("Job ID " + iID + " is starting...");

            iRecordID = recordUpdater.addNewRecord(iID, strName, DateTime.Now);

            try
            {
                process.StartInfo.FileName  = strProcess;
                process.StartInfo.Arguments = strArguments;
                setWorkingDirectory();
                process.Start();
                iProcessID = process.Id;
                process.WaitForExit(iTimeOut);
                if (processStillRunning(iProcessID))
                {
                    iTimedOut = 1;
                    process.Kill();
                    QuartzService.log("Job ID " + iID + " was stopped; Process TimeOut of " + iTimeOut + "ms Exceeded...");
                }
                else
                {
                    QuartzService.log("Job ID " + iID + " has completed...");
                }
                recordUpdater.setRecordEnding(iRecordID, DateTime.Now, iTimedOut);
            }
            catch (Exception ex)
            {
                QuartzService.log(@"Exception When Running " + strName + "\n" +
                                  ex.StackTrace);
            }
        }
コード例 #10
0
        public bool setRecordEnding(int RecordID, DateTime endTime, int timedOut)
        {
            bool bSuccessful = false;

            try
            {
                var jobRecordQuery = from jobRecord in db.JobRecords
                                     where jobRecord.RecordId == RecordID
                                     select jobRecord;
                JobRecord record = jobRecordQuery.Single();
                record.EndTime  = endTime;
                record.TimedOut = timedOut;
                db.SaveChanges();
                bSuccessful = true;
            }
            catch (Exception ex)
            {
                QuartzService.log("Error adding job record ending time for RecordID " + RecordID + " to the JobRecords DB\n" + ex);
            }
            return(bSuccessful);
        }
コード例 #11
0
        /// <summary>
        /// Rename json files to err
        /// </summary>
        /// <param name="InputString"></param>
        private void renameToERR(String InputString)
        {
            String strNewFileName = String.Empty;

            if (InputString.Contains("."))
            {
                strNewFileName = InputString.Remove(InputString.LastIndexOf(".") + 1);
            }
            else
            {
                strNewFileName = String.Concat(InputString, ".");
            }
            strNewFileName = String.Concat(strNewFileName, "err");

            try
            {
                File.Move(InputString, strNewFileName);
            }
            catch (Exception ex)
            {
                QuartzService.log("Error renaming  " + InputString + " to .err Exception\n" + ex.StackTrace);
            }
        }
コード例 #12
0
ファイル: JobScheduler.cs プロジェクト: radtek/QuartService
        /// <summary>
        /// Load a single job from SQLDB by JobID
        /// </summary>
        /// <param name="JobID"></param>
        /// <returns>Template</returns>
        public JobTemplate loadJobFromDB(String JobID)
        {
            JobTemplate template = new JobTemplate();

            try
            {
                int   iJob  = Int32.Parse(JobID);
                DBJob dbJob = db.Jobs.FirstOrDefault(j => j.JobId == iJob);
                template.ID    = dbJob.JobId;
                template.Name  = dbJob.JobName;
                template.Group = dbJob.JobGroup;
                template.processPathStringsFromDB(dbJob.Process, dbJob.WorkingDirectory);
                template.Arguments        = dbJob.Arguments;
                template.WorkingDirectory = dbJob.WorkingDirectory;
                template.CronSchedule     = dbJob.CronSchedule;
                template.Timeout          = dbJob.TimeOut.ToString();
            }
            catch (Exception ex)
            {
                QuartzService.log("Error loading Job from DB: " + "Exception\n" + ex.StackTrace);
            }
            return(template);
        }
コード例 #13
0
ファイル: QuartzService.cs プロジェクト: radtek/QuartService
        /// <summary>
        /// Checks for required directories and clears flags folder
        /// </summary>
        private void checkDirectories()
        {
            try
            {
                if (!Directory.Exists(LOGFILEDIRECTORY))
                {
                    Directory.CreateDirectory(LOGFILEDIRECTORY);
                }
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("Error checking " + LOGFILEDIRECTORY + "\n" + ex.StackTrace);
            }
            try
            {
                if (!Directory.Exists(Settings.Default.IncomingDirectory))
                {
                    Directory.CreateDirectory(Settings.Default.IncomingDirectory);
                }
            }
            catch (Exception ex)
            {
                QuartzService.log("Error checking for incoming folder " + "\n" + ex.StackTrace);
            }
            try
            {
                if (!Directory.Exists(Settings.Default.JobsDirectory))
                {
                    Directory.CreateDirectory(Settings.Default.JobsDirectory);
                }
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("Error checking " + LOGFILEDIRECTORY + "\n" + ex.StackTrace);
            }

            try
            {
                if (!Directory.Exists(strFlagsFolder))
                {
                    Directory.CreateDirectory(strFlagsFolder);
                }
                else
                {
                    try
                    {
                        String[] flagFiles = Directory.GetFiles(strFlagsFolder);
                        if (flagFiles.Length > 0)
                        {
                            foreach (String file in flagFiles)
                            {
                                try
                                {
                                    File.Delete(file);
                                }
                                catch (Exception ex)
                                {
                                    EventLog.WriteEntry("Error deleting flag " + file + " in " + strFlagsFolder + "\n" + ex.StackTrace);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        EventLog.WriteEntry("Error checking for flags in " + strFlagsFolder + "\n" + ex.StackTrace);
                    }
                }
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("Error checking " + strFlagsFolder + "\n" + ex.StackTrace);
            }
        }