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