Exemplo n.º 1
0
 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);
     }
 }
Exemplo n.º 2
0
        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);
        }