示例#1
0
        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);
            }
        }
示例#2
0
        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));
                })));
            }
        }
示例#3
0
        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);
            }
        }