/// <summary> /// Initializes the manager /// </summary> /// <returns>TRUE for success, FALSE for failure</returns> public bool InitMgr() { // Define the default logging info // This will get updated below LogTools.CreateFileLogger(DEFAULT_BASE_LOGFILE_NAME, BaseLogger.LogLevels.DEBUG); // Create a database logger connected to the Manager Control DB // Once the initial parameters have been successfully read, // we remove this logger than make a new one using the connection string read from the Manager Control DB var defaultDmsConnectionString = Properties.Settings.Default.MgrCnfgDbConnectStr; var hostName = System.Net.Dns.GetHostName(); var applicationName = "PkgFolderCreateManager_" + hostName; var defaultDbLoggerConnectionString = DbToolsFactory.AddApplicationNameToConnectionString(defaultDmsConnectionString, applicationName); LogTools.CreateDbLogger(defaultDbLoggerConnectionString, "FolderCreate: " + hostName); // Get the manager settings try { var localSettings = GetLocalManagerSettings(); mMgrSettings = new MgrSettingsDB { TraceMode = false }; RegisterEvents(mMgrSettings); mMgrSettings.CriticalErrorEvent += ErrorEventHandler; var success = mMgrSettings.LoadSettings(localSettings, true); if (!success) { if (string.Equals(mMgrSettings.ErrMsg, MgrSettings.DEACTIVATED_LOCALLY)) { throw new ApplicationException(MgrSettings.DEACTIVATED_LOCALLY); } throw new ApplicationException("Unable to initialize manager settings class: " + mMgrSettings.ErrMsg); } } catch { // Failures are logged by clsMgrSettings to local emergency log file return(false); } // Setup the loggers var logFileNameBase = mMgrSettings.GetParam("LogFilename", "FolderCreate"); BaseLogger.LogLevels logLevel; if (int.TryParse(mMgrSettings.GetParam("DebugLevel"), out var debugLevel)) { logLevel = (BaseLogger.LogLevels)debugLevel; } else { logLevel = BaseLogger.LogLevels.INFO; } LogTools.CreateFileLogger(logFileNameBase, logLevel); // Typically: // Data Source=gigasax;Initial Catalog=DMS_Pipeline;Integrated Security=SSPI; var logCnStr = mMgrSettings.GetParam("ConnectionString"); var moduleName = mMgrSettings.GetParam("ModuleName"); var dbLoggerConnectionString = DbToolsFactory.AddApplicationNameToConnectionString(logCnStr, mMgrSettings.ManagerName); LogTools.CreateDbLogger(dbLoggerConnectionString, moduleName); LogTools.MessageLogged += MessageLoggedHandler; // Make the initial log entry var appVersion = Assembly.GetExecutingAssembly().GetName().Version; var msg = "=== Started Package Folder Creation Manager V" + appVersion + " === "; LogTools.LogMessage(msg); // Setup the message queue mMsgHandler = new clsMessageHandler { BrokerUri = mMgrSettings.GetParam("MessageQueueURI"), CommandQueueName = mMgrSettings.GetParam("ControlQueueName"), BroadcastTopicName = mMgrSettings.GetParam("BroadcastQueueTopic"), StatusTopicName = mMgrSettings.GetParam("MessageQueueTopicMgrStatus"), MgrSettings = mMgrSettings }; if (!mMsgHandler.Init()) { // Most error messages provided by .Init method, but debug message is here for program tracking LogDebug("Message handler init error"); return(false); } LogDebug("Message handler initialized"); // Connect message handler events mMsgHandler.CommandReceived += OnMsgHandler_CommandReceived; mMsgHandler.BroadcastReceived += OnMsgHandler_BroadcastReceived; // Setup the status file class var appPath = PRISM.FileProcessor.ProcessFilesOrDirectoriesBase.GetAppPath(); var fInfo = new FileInfo(appPath); string statusFileNameLoc; if (fInfo.DirectoryName == null) { statusFileNameLoc = "Status.xml"; } else { statusFileNameLoc = Path.Combine(fInfo.DirectoryName, "Status.xml"); } mStatusFile = new clsStatusFile(statusFileNameLoc, mMsgHandler) { LogToMsgQueue = mMgrSettings.GetParam("LogStatusToMessageQueue", false), MgrName = mMgrSettings.ManagerName }; RegisterEvents(mStatusFile); mStatusFile.InitStatusFromFile(); SetStartupStatus(); mStatusFile.WriteStatusFile(); LogDebug("Status file init complete"); // Register the listeners for the message handler mMsgHandler.RegisterListeners(); // Everything worked return(true); }
private string GenerateStatusXML( clsStatusFile status, DateTime lastUpdate, int processId, int cpuUtilization, float freeMemoryMB, float runTimeHours) { // Note that we use this instead of using .ToString("o") // because .NET includes 7 digits of precision for the milliseconds, // and SQL Server only allows 3 digits of precision const string ISO_8601_DATE = "yyyy-MM-ddTHH:mm:ss.fffK"; const string LOCAL_TIME_FORMAT = "yyyy-MM-dd hh:mm:ss tt"; // Create a new memory stream in which to write the XML var memStream = new MemoryStream(); using var writer = new XmlTextWriter(memStream, System.Text.Encoding.UTF8); writer.Formatting = Formatting.Indented; writer.Indentation = 2; // Create the XML document in memory writer.WriteStartDocument(true); writer.WriteComment("Package Folder Create manager status"); // Root level element writer.WriteStartElement("Root"); writer.WriteStartElement("Manager"); writer.WriteElementString("MgrName", status.MgrName); writer.WriteElementString("MgrStatus", status.ConvertMgrStatusToString(status.MgrStatus)); writer.WriteComment("Local status log time: " + lastUpdate.ToLocalTime().ToString(LOCAL_TIME_FORMAT)); writer.WriteComment("Local last start time: " + status.TaskStartTime.ToLocalTime().ToString(LOCAL_TIME_FORMAT)); // Write out times in the format 2017-07-06T23:23:14.337Z writer.WriteElementString("LastUpdate", lastUpdate.ToUniversalTime().ToString(ISO_8601_DATE)); writer.WriteElementString("LastStartTime", status.TaskStartTime.ToUniversalTime().ToString(ISO_8601_DATE)); writer.WriteElementString("CPUUtilization", cpuUtilization.ToString("##0.0")); writer.WriteElementString("FreeMemoryMB", freeMemoryMB.ToString("##0.0")); writer.WriteElementString("ProcessID", processId.ToString()); writer.WriteStartElement("RecentErrorMessages"); foreach (var errMsg in clsStatusData.ErrorQueue) { writer.WriteElementString("ErrMsg", errMsg); } writer.WriteEndElement(); // RecentErrorMessages writer.WriteEndElement(); // Manager writer.WriteStartElement("Task"); writer.WriteElementString("Tool", status.Tool); writer.WriteElementString("Status", status.ConvertTaskStatusToString(status.TaskStatus)); writer.WriteElementString("Duration", runTimeHours.ToString("0.00")); writer.WriteElementString("DurationMinutes", (runTimeHours * 60).ToString("0.0")); writer.WriteElementString("Progress", status.Progress.ToString("##0.00")); writer.WriteElementString("CurrentOperation", status.CurrentOperation); writer.WriteStartElement("TaskDetails"); writer.WriteElementString("Status", status.ConvertTaskStatusDetailToString(status.TaskStatusDetail)); writer.WriteElementString("Job", status.JobNumber.ToString()); writer.WriteElementString("Step", status.JobStep.ToString()); writer.WriteElementString("Dataset", status.Dataset); writer.WriteElementString("MostRecentLogMessage", clsStatusData.MostRecentLogMessage); writer.WriteElementString("MostRecentJobInfo", status.MostRecentJobInfo); writer.WriteEndElement(); // TaskDetails writer.WriteEndElement(); // Task writer.WriteEndElement(); // Root // Close out the XML document (but do not close writer yet) writer.WriteEndDocument(); writer.Flush(); // Now use a StreamReader to copy the XML text to a string variable memStream.Seek(0, SeekOrigin.Begin); var srMemoryStreamReader = new StreamReader(memStream); var xmlText = srMemoryStreamReader.ReadToEnd(); srMemoryStreamReader.Close(); memStream.Close(); return(xmlText); }