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; } foreach (var message in messages) { var call = _cache.GetOrAdd( key: message.GetType(), valueFactory: (type) => { var getHandleMethod = _handleMethod.MakeGenericMethod(type); var instance = Expression.Constant(this); var parameter = Expression.Parameter(typeof(IEvent), "evt"); var expression = Expression.Lambda <Action <IEvent> >( Expression.Call(instance, getHandleMethod, parameter), parameter); return(expression.Compile()); }); call(message); } //记录业务消费者处理的的最后的事件 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); } }
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); } }