Ejemplo n.º 1
0
        public static void ThreadMethod(GuaranteedDeliveryThreadDelegate threadData)
        {
            SQLiteConnection dbConnection = null;
            var targets = new Dictionary <string, NetworkJsonTarget>();

            while (!threadData.IsAppShuttingDown)
            {
                try
                {
                    if (dbConnection == null)
                    {
                        dbConnection = LogStorageDbGlobals.OpenNewConnection();
                    }

                    var logMessages = LogStorageTable.GetNextTenRecords(dbConnection);
                    if (logMessages.Rows.Count == 0)
                    {
                        Thread.Sleep(500);
                    }
                    else
                    {
                        for (var inc = 0; inc < logMessages.Rows.Count; inc++)
                        {
                            var messageId  = logMessages.Rows[inc][LogStorageTable.Columns.MessageId.Index].ToString();
                            var endpoint   = logMessages.Rows[inc][LogStorageTable.Columns.Endpoint.Index].ToString();
                            var logMessage = logMessages.Rows[inc][LogStorageTable.Columns.LogMessage.Index].ToString();
                            NetworkJsonTarget currentTarget = null;
                            if (!targets.TryGetValue(endpoint, out currentTarget))
                            {
                                currentTarget = new NetworkJsonTarget {
                                    Endpoint = endpoint
                                };
                                targets.Add(endpoint, currentTarget);
                            }
                            currentTarget.Write(logMessage);
                            LogStorageTable.DeleteProcessedRecord(dbConnection, messageId);
                            Interlocked.Increment(ref TotalMessageCount);
                            Console.WriteLine($"OUT={TotalMessageCount}");
                        }
                    }
                }
                catch (Exception ex)
                {
                    dbConnection?.Close();
                    dbConnection = null;
                    targets.Clear();
                    Thread.Sleep(1000);
                }
            }
            Console.WriteLine("Background Thread Shutdown");
            threadData.ThreadHasShutdown();
        }
        protected override void OnStart(string[] args)
        {
            var logger = LoggerFactory.GetInstrumentationLogger();

            logger.InitializeExecutionLogging($"{this.GetRealServiceName(ServiceName)} Startup");

            try
            {
                using (var dbConnection = LocalLogStorageDB.LogStorageDbGlobals.OpenNewConnection())
                {
                    if (!LogStorageTable.TableExists(dbConnection))
                    {
                        logger.PushInfoWithTime($"{LogStorageTable.TableName} does not exist, creating.");
                        LogStorageTable.CreateTable(dbConnection);
                        logger.PushInfoWithTime($"{LogStorageTable.TableName} created.");
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("SQLite Database Opening / Creation Failed.", ex);
            }

            try
            {
                var options = new StartOptions();
                options.Urls.Add(_commandLineModel.Endpoint);

                _signalR = WebApp.Start(options);
                logger.PushInfoWithTime("SignalR Web App Started.");
            }
            catch (Exception ex)
            {
                throw new Exception("SignalR Hub Initialization Failed.", ex);
            }

            try
            {
                _guaranteedDeliveryThreadDelegate = new GuaranteedDeliveryThreadDelegate();

                var thread = new Thread(() => GuaranteedDeliveryThread.ThreadMethod(_guaranteedDeliveryThreadDelegate));
                thread.Start();
                logger.PushInfoWithTime("Guaranteed Delivery Thread Started.");
            }
            catch (Exception ex)
            {
                throw new Exception("Guaranteed Delivery Thread Initialization Failed.", ex);
            }

            logger.LogExecutionComplete(0);
        }