コード例 #1
0
        public override void Handle(IEvent[] messages, long endSequence)
        {
            _logger.LogDebug($"回溯事件:{messages.Length}");

            //过滤回溯时间,因为存在重建,所以可能重复消费
            messages = messages.Where(a => a.UTCTimestamp > _subscribeEvent.UTCTimestamp).ToArray();
            if (!messages.Any())
            {
                return;
            }

            var dict = messages.GroupBy(a => a.AggregateRootTypeName).ToDictionary(a => a.Key, a => a.ToList());

            List <IAggregateRoot> aggregateRoots = new List <IAggregateRoot>();
            List <IAggregateRoot> removeRoots    = new List <IAggregateRoot>();
            List <IAggregateRoot> addRoots       = new List <IAggregateRoot>();

            //获取
            foreach (var item in dict)
            {
                Type entityType;
                if (!_cacheEntitys.TryGetValue(item.Key, out entityType))
                {
                    throw new Exception($"无法找到类型{item.Key}的聚合根");
                }

                //这里可以先从缓存获取,如果没有全部找到,再从数据库拿没有取到的。

                var createIds = item.Value.Where(a => a.Operation == EventOperation.Created).Select(a => a.AggregateRootId).ToArray();

                var ids = item.Value.Select(a => a.AggregateRootId).Except(createIds).ToArray();


                List <IAggregateRoot> roots = new List <IAggregateRoot>();
                foreach (var id in ids)
                {
                    var key  = GetKey(entityType, id);
                    var root = _snapshootCache.Get(entityType, id);
                    if (root == null)
                    {
                        continue;
                    }
                    roots.Add(root);
                }
                var storeIds = ids.Except(roots.Select(a => a.Id)).ToArray();
                if (storeIds.Length > 0)
                {
                    var snapshootStore = _snapshootStoreFactory.Create(entityType);
                    var storeRoots     = snapshootStore.Get(storeIds);
                    roots.AddRange(storeRoots);
                }

                aggregateRoots.AddRange(roots);
            }

            //重建
            foreach (var item in messages)
            {
                _logger.LogDebug($"执行快照事件:{item.Id} - {item.Operation} - {item.AggregateRootTypeName} - {item.AggregateRootId}");
                IAggregateRoot root = aggregateRoots.FirstOrDefault(a => a.Id == item.AggregateRootId && a.GetType().Name.Equals(item.AggregateRootTypeName));

                if (item.Operation == EventOperation.Created)
                {
                    Type entityType;
                    if (!_cacheEntitys.TryGetValue(item.AggregateRootTypeName, out entityType))
                    {
                        //throw new Exception($"无法找到类型{item.AggregateRootTypeName}的聚合根");
                        _logger.LogError($"无法找到类型{item.AggregateRootTypeName}的聚合根");
                        continue;
                    }

                    root = Activator.CreateInstance(entityType, true) as IAggregateRoot;
                    aggregateRoots.Add(root);
                    addRoots.Add(root);
                }
                else if (item.Operation == EventOperation.Removed)
                {
                    removeRoots.Add(root);
                }
                if (root == null)
                {
                    _logger.LogError($"回溯快照的时候没有找到聚合根:[{item.Id}] - [{item.AggregateRootId} - {item.AggregateRootTypeName}]");
                    continue;
                }
                _eventRebuildHandler.Handle(root, item);
            }


            var rootDict = aggregateRoots.GroupBy(a => a.GetType()).ToDictionary(a => a.Key, a => a.ToList());

            foreach (var item in rootDict)
            {
                var snapshootStore = _snapshootStoreFactory.Create(item.Key);

                var addeds  = item.Value.Intersect(addRoots).ToArray();
                var removed = item.Value.Intersect(removeRoots).ToArray();
                var updated = item.Value.Except(addeds).Except(removed).ToArray();

                //存储快照
                TryActionStore(list => snapshootStore.Add(list), addeds);
                TryActionStore(list => snapshootStore.Remove(list), removed);
                TryActionStore(list => snapshootStore.Update(list), updated);
            }

            //存储缓存
            SetCache(aggregateRoots.Except(removeRoots));
            RemoveCache(removeRoots);


            //记录快照消费者处理的的最后的事件

            var evt = messages.LastOrDefault();

            if (evt != null)
            {
                _subscribeEvent.AggregateRootId       = evt.AggregateRootId;
                _subscribeEvent.AggregateRootTypeName = evt.AggregateRootTypeName;
                _subscribeEvent.EventId      = evt.Id;
                _subscribeEvent.UTCTimestamp = evt.UTCTimestamp;
                _subscribeEventStore.Save(_subscribeEvent);

                _eventHandleSubject.Update(_subscribeEvent);
            }
        }
コード例 #2
0
 private List <IAggregateRoot> Get(Type rootType, Guid[] ids)
 {
     return(_snapshootStoreFactory.Create(rootType).Get(ids));
 }