private void Flush(IAuditDatabaseContext database, int reTry) { try { database.SaveChanges(); } catch (Exception e) { if (reTry == 0) { throw; } reTry--; Thread.Sleep(DATABASE_RETRY_DELAY); Flush(database, reTry); } }
public void Flush() { bool AddLogsToDatabase(IAuditDatabaseContext databaseContext) { var _hadLogs = false; using (var session = _warewolfQueue.OpenSession()) { for (int insertCount = 0; insertCount <= 250; insertCount++) { var auditLog = session.Dequeue <AuditLog>(); if (auditLog is null) { break; } databaseContext.Audits.Add(auditLog); _hadLogs = true; } } return(_hadLogs); } void TryGetDatabaseContext(ref IAuditDatabaseContext databaseContext) { int count = MAX_DATABASE_TRIES; do { try { databaseContext = _databaseContextFactory.Get(); } catch (Exception) { count--; if (count <= 0) { throw; } } Thread.Sleep(DATABASE_RETRY_DELAY); } while (databaseContext is null && --count >= 0); } if (_warewolfQueue.IsEmpty()) { return; } IAuditDatabaseContext database = null; var hadLogs = false; do { TryGetDatabaseContext(ref database); using (database) { using (var transaction = database.Database.BeginTransaction()) { try { try { hadLogs = AddLogsToDatabase(database); } finally { Flush(database, MAX_DATABASE_TRIES); } transaction.Commit(); } catch { transaction.Rollback(); } } } } while (hadLogs); }