protected void ValidateRunningJobs() { Dictionary <String, Object> sqlParameters = new Dictionary <String, Object>(); sqlParameters.Add(":machinename", Environment.MachineName); // Pull the jobs running on this machine. DataTable dt = SqlUtilities.GetData(_ConnectionString, _SqlJobsInProgress, sqlParameters); if ((dt != null) && (dt.Rows != null) && (dt.Rows.Count > 0)) { sqlParameters.Add(":inprogress", false); sqlParameters.Add(":scanrequested", false); sqlParameters.Add(":jobstatus", "Error"); sqlParameters.Add(":statusdescription", "See activity log for details."); sqlParameters.Add(":pkey", -1); for (int i = 0; i < dt.Rows.Count; i++) { try { if (!MiscUtilities.isAlive(dt.Rows[i]["definition_name"].ToString())) { sqlParameters[":pkey"] = MiscUtilities.ObjectToInteger(dt.Rows[i]["pkey"], "No primary key defined."); SqlUtilities.ExcecuteNonQuery(_ConnectionString, _SqlUpdateInProgressStatus, sqlParameters); } } catch (Exception ex) { LocalLog.AddLine("Error while updating in progress job status. Error message was: " + ex.Message); _AppLog.WriteEntry(ex.StackTrace, System.Diagnostics.EventLogEntryType.Error); } } } }
protected Boolean BackupCastDatabase(int JobKey, String JobFileName, String RawJobFileName) { Dictionary <String, Object> sqlParameters = new Dictionary <string, object>(); sqlParameters.Add(":inprogress", true); sqlParameters.Add(":scanrequested", true); sqlParameters.Add(":jobstatus", "Ready"); sqlParameters.Add(":statusdescription", String.Format("Backup Started: {0:MMMM d, yyyy HH:mm:ss}", DateTime.Now)); sqlParameters.Add(":machinename", Environment.MachineName); sqlParameters.Add(":jobkey", JobKey); JobFileName = _tokens.Resolve("Scheduler", "BackupDatabase", "Missing the Scheduler/BackupDatabase attribute with the name of the backup definition. SQL query. Please add the name of the backup definition to the settings file under SchedulerSettings/Tokens/Scheduler BackupDatabase"); // Look for backup database request DataTable dt = SqlUtilities.GetData(_ConnectionString, _SqlNextDbBackup); if ((dt == null) || (dt.Rows.Count == 0)) { return(false); } for (int i = 0; i < dt.Rows.Count; i++) { try { JobKey = MiscUtilities.ObjectToInteger(dt.Rows[0]["pkey"], "No primary key is definied"); sqlParameters[":jobkey"] = JobKey; RunJava(JobKey, JobFileName, RawJobFileName); // Job finished update record. sqlParameters[":jobstatus"] = "Backup Completed"; sqlParameters[":statusdescription"] = String.Format("Backup Completed: {0:MMMM d, yyyy HH:mm:ss}", DateTime.Now); } catch (Exception ex) { LocalLog.AddLine("Database Backup Error: " + ex.Message); sqlParameters[":jobstatus"] = "Error"; String message = String.Format("Recorded: {0:MMMM d, yyyy HH:mm:ss}, Message: {1} ", DateTime.Now, ex.Message); if (message.Length > 99) { message = message.Substring(0, 99); } sqlParameters[":statusdescription"] = message; } SqlUtilities.ExcecuteNonQuery(_ConnectionString, _SqlUpdateInProgressStatus, sqlParameters); } return(false); }
protected void CheckScheduledJobs() { DateTime currentDateTime = DateTime.Now; // Check = SELECT pkey, definition_name FROM fnma_measure8.scan_manager WHERE scheduled_date is not null and scheduled_date < current_timestamp and definition_name is not null // Queue = UPDATE fnma_measure8.scan_manager SET scan_requested=true, request_date=current_timestamp, scan_status='Queued', machine_name=null, scheduled_date=null WHERE pkey=:key and scan_requested=false and machine_name is null and in_progress=false and scan_status='Completed' // Put here to lighten the load on the database server, system checks schedules every 2 minutes. // With 4 machines running this code, the offset between them should ensure pretty quick schedule pickups. if (_nextScheduleCheck > currentDateTime) { return; } DataTable dt = SqlUtilities.GetData(_ConnectionString, _sqlScheduleCheck); if ((dt != null) && (dt.Rows != null) && (dt.Rows.Count > 0)) { Dictionary <String, Object> sqlParameters = new Dictionary <String, Object>(); sqlParameters.Add(":key", -1); sqlParameters.Add(":requestdate", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); for (int i = 0; i < dt.Rows.Count; i++) { string job_name = ""; try { if ((DateTime)dt.Rows[i]["scheduled_date"] < DateTime.Now) { job_name = MiscUtilities.ObjectToStringDefault(dt.Rows[i]["definition_name"], "Definition name is blank."); sqlParameters[":key"] = MiscUtilities.ObjectToInteger(dt.Rows[i]["pkey"], "No primary key defined."); SqlUtilities.ExcecuteNonQuery(_ConnectionString, _sqlQueueScheduledJob, sqlParameters); } } catch (Exception ex) { LocalLog.AddLine("Error while queuing scheduled job. Error message was: " + ex.Message); _AppLog.WriteEntry(ex.StackTrace, System.Diagnostics.EventLogEntryType.Error); } } } _nextScheduleCheck = DateTime.Now.AddMinutes(2); }
public void ProcessQueue() { int JobKey = -1; try { // Validate the processing job and update those that are no long running. ValidateRunningJobs(); // Check for any scheduled work CheckScheduledJobs(); // Check for any queued work DataRow dr = GetNextJob(); if (dr == null) { return; } JobKey = MiscUtilities.ObjectToInteger(dr["pkey"], "No primary key is definied"); String JobFileName = MiscUtilities.ObjectToString(dr["definition_name"], "No definition file name is defined."); String RawJobFileName = JobFileName; String lockFilename = MiscUtilities.LockFilename(RawJobFileName); String action_requested = MiscUtilities.ObjectToStringDefault(dr["action_requested"], "rescan"); using (FileStream fs = new FileStream(lockFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine("While file is locked open, processing thread is running. Seeing this message means the thread may not be running, please delete this file."); if (_IsDbBackup) { BackupCastDatabase(JobKey, JobFileName, RawJobFileName); } else { String message = "Processing"; switch (action_requested.ToLower()) { case "publish": JobFileName = _tokens.Resolve("Scheduler", "PublishDefinition", "No publish definition defined in the settings file. Please add a Tokens/Scheduler PublishDefinition"); message = "Publishing"; break; case "empty": case "rescan": message = "Processing"; break; case "onboard": JobFileName = _tokens.Resolve("Scheduler", "OnBoardDefinition", "No onboard definition defined in the settings file. Please add a Tokens/Scheduler OnBoardDefinition"); message = "OnBoarding"; break; default: throw new Exception(String.Format("{0} is not a valid action request.", action_requested)); } // Kick off the definition RunDefinition(JobKey, JobFileName, RawJobFileName, message); } } fs.Close(); } File.Delete(lockFilename); } catch (Exception ex) { lock (_lock) { LocalLog.AddLine("Queue Error: " + ex.Message); } _AppLog.WriteEntry(ex.StackTrace, System.Diagnostics.EventLogEntryType.Error); if (JobKey > 0) { Dictionary <String, Object> sqlParameters = new Dictionary <string, object>(); sqlParameters.Add(":jobkey", JobKey); sqlParameters.Add(":jobstatus", "Error"); sqlParameters.Add(":inprogress", false); sqlParameters.Add(":scanrequested", false); String message = String.Format("Recorded: {0:MMMM d, yyyy HH:mm:ss}, Message: {1} ", DateTime.Now, ex.Message); if (message.Length > 99) { message = message.Substring(0, 99); } sqlParameters.Add(":statusdescription", message); SqlUtilities.ExcecuteNonQuery(_ConnectionString, _SqlUpdateInProgressStatus, sqlParameters); } } }