public void Observer(string group, Type observerType) { var funcs = GetEventHandlers(group); funcs.Add(func); eventHandlers.Add(func); observerVersionHandlers.Add((actorId, version) => GetVersion(observerType, actorId).GetAndSaveVersion(version)); //内部函数 Task func(byte[] bytes) { var(success, actorId) = EventBytesTransport.GetActorId <PrimaryKey>(bytes); if (success) { if (typeof(IObserver).IsAssignableFrom(observerType)) { return(GetObserver(observerType, actorId).OnNext(new Immutable <byte[]>(bytes))); } else if (typeof(IConcurrentObserver).IsAssignableFrom(observerType)) { return(GetConcurrentObserver(observerType, actorId).OnNext(new Immutable <byte[]>(bytes))); } else { throw new NotSupportedException($"{observerType.FullName} must inheritance from 'IConcurrentObserver' or 'IObserver'"); } } return(Task.CompletedTask); } }
public void Observer(string group, Type observerType) { if (!typeof(IObserver).IsAssignableFrom(observerType)) { throw new NotSupportedException($"{observerType.FullName} must inheritance from IObserver"); } GetEventHandlers(group).Add(EventHandler); GetBatchEventHandlers(group).Add(BatchEventHandler); eventHandlers.Add(EventHandler); batchEventHandlers.Add(BatchEventHandler); observerVersionHandlers.Add((actorId, version) => GetObserver(observerType, actorId).GetAndSaveVersion(version)); observerSyncHandlers.Add((actorId, version) => GetObserver(observerType, actorId).SyncFromObservable(version)); observerResetHandlers.Add((actorId) => GetObserver(observerType, actorId).Reset()); //内部函数 Task EventHandler(byte[] bytes) { var(success, actorId) = EventBytesTransport.GetActorId <PrimaryKey>(bytes); if (success) { return(GetObserver(observerType, actorId).OnNext(new Immutable <byte[]>(bytes))); } else { if (Logger.IsEnabled(LogLevel.Error)) { Logger.LogError($"{nameof(EventBytesTransport.GetActorId)} failed"); } } return(Task.CompletedTask); } Task BatchEventHandler(List <byte[]> list) { var groups = list.Select(bytes => { var(success, GrainId) = EventBytesTransport.GetActorId <PrimaryKey>(bytes); if (!success) { if (Logger.IsEnabled(LogLevel.Error)) { Logger.LogError($"{nameof(EventBytesTransport.GetActorId)} failed"); } } return(success, GrainId, bytes); }).Where(o => o.success).GroupBy(o => o.GrainId); return(Task.WhenAll(groups.Select(kv => { var items = kv.Select(item => item.bytes).ToList(); return GetObserver(observerType, kv.Key).OnNext(new Immutable <List <byte[]> >(items)); }))); } }
public void Observer(string group, Type observerType) { var funcs = GetEventHandlers(group); funcs.Add(func); eventHandlers.Add(func); observerVersionHandlers.Add((actorId, version) => GetObserver(observerType, actorId).GetAndSaveVersion(version)); //内部函数 Task func(byte[] bytes) { var(success, actorId) = EventBytesTransport.GetActorId <PrimaryKey>(bytes); if (success) { var observer = GetObserver(observerType, actorId); if (observer is IConcurrentObserver concurrentObserver) { return(concurrentObserver.ConcurrentOnNext(new Immutable <byte[]>(bytes))); } return(observer.OnNext(new Immutable <byte[]>(bytes))); } return(Task.CompletedTask); } }