private static void Rollback(EventLog log, EventLogEntry logEntry, Exception reason) { var queueId = log.Id; if (logEntry.Operation == EventOperation.Raise) { var content = DTObject.CreateReusable(logEntry.ContentCode); var entryId = content.GetValue <int>("entryId"); var queue = EventQueue.Find(queueId); if (queue.IsEmpty()) { return; } var entry = queue.GetEntry(entryId); if (!entry.IsEmpty()) { Reverse(queue, entry); } EventQueue.Update(queue); } else if (logEntry.Operation == EventOperation.Start) { EventQueue.Delete(queueId); } }
/// <summary> /// 移除超过24小时已完成的事件锁、事件监视器、队列信息 /// 我们不能在执行完领域事件后立即删除这些信息,因为有可能是外界调用本地的事件,稍后可能外界要求回逆事件 /// 因此我们只删除24小时过期的信息,因为外界不可能过了24小时后又要求回逆 /// </summary> /// <param name="minutes"></param> private static void Clear() { DataContext.NewScope(() => { var repository = Repository.Create <IEventLockRepository>(); var locks = repository.FindExpireds(24); foreach (var @lock in locks) { var queueId = @lock.Id; var queue = EventQueue.Find(queueId); if (!queue.IsSucceeded) { continue; //对于没有执行成功的队列,我们不删除日志等信息,这样管理员可以排查错误 } DataContext.NewScope(() => { var monitor = EventMonitor.Find(queueId); if (!monitor.IsEmpty()) { EventMonitor.Delete(monitor); } EventQueue.Delete(queueId); EventLogEntry.Deletes(queueId); //删除日志的所有条目 EventLog.Delete(queueId); }, true); EventLock.Delete(@lock); } }, true); }