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); }