コード例 #1
0
        /// <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);
        }
コード例 #2
0
        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);
        }