Example #1
0
        public ObserverUnit <PrimaryKey> UnreliableObserver(string group, Func <IServiceProvider, IFullyEvent <PrimaryKey>, ValueTask> handler)
        {
            var funcs = GetEventHandlers(group);

            funcs.Add(func);
            eventHandlers.Add(func);
            return(this);

            //内部函数
            Task func(byte[] bytes)
            {
                var(success, transport) = EventBytesTransport.FromBytes <PrimaryKey>(bytes);
                if (success)
                {
                    var data = serializer.Deserialize(TypeContainer.GetType(transport.EventTypeCode), transport.EventBytes);
                    if (data is IEvent @event && transport.GrainId is PrimaryKey actorId)
                    {
                        var eventBase = EventBase.FromBytes(transport.BaseBytes);
                        var tellTask  = handler(serviceProvider, new FullyEvent <PrimaryKey>
                        {
                            StateId = actorId,
                            Base    = eventBase,
                            Event   = @event
                        });
                        if (!tellTask.IsCompletedSuccessfully)
                        {
                            return(tellTask.AsTask());
                        }
                    }
                }
                return(Task.CompletedTask);
            }
        }
Example #2
0
        public void Observer()
        {
            if (!typeof(IPoleEventHandler).IsAssignableFrom(EventHandlerType))
            {
                throw new NotSupportedException($"{EventHandlerType.FullName} must inheritance from PoleEventHandler");
            }
            eventHandler = EventHandler;
            //内部函数
            Task EventHandler(byte[] bytes)
            {
                var(success, transport) = EventBytesTransport.FromBytes(bytes);
                if (!success)
                {
                    if (Logger.IsEnabled(LogLevel.Error))
                    {
                        Logger.LogError($" EventId:{nameof(EventBytesTransport.EventId)} is not a event");
                    }
                }

                // 批量处理的时候 grain Id 取第一个 event的id
                using (var scope = serviceProvider.CreateScope())
                {
                    var eventHandlerInstance = scope.ServiceProvider.GetRequiredService(EventHandlerType);
                    var serializer           = scope.ServiceProvider.GetRequiredService <ISerializer>() as ISerializer;
                    var eventTypeFinder      = scope.ServiceProvider.GetRequiredService <IEventTypeFinder>() as IEventTypeFinder;
                    var loggerFactory        = scope.ServiceProvider.GetRequiredService <ILoggerFactory>() as ILoggerFactory;
                    var logger = loggerFactory.CreateLogger(EventHandlerType);
                    return(GetObserver(EventHandlerType)(eventHandlerInstance, transport, serializer, eventTypeFinder, logger, EventHandlerType));
                }
            }
        }
Example #3
0
        public ObserverUnit <PrimaryKey> UnreliableObserver(
            string group,
            Func <IServiceProvider,
                  FullyEvent <PrimaryKey>, ValueTask> handler)
        {
            GetEventHandlers(group).Add(EventHandler);
            GetBatchEventHandlers(group).Add(BatchEventHandler);
            eventHandlers.Add(EventHandler);
            batchEventHandlers.Add(BatchEventHandler);
            return(this);

            //内部函数
            Task EventHandler(byte[] bytes)
            {
                var(success, transport) = EventBytesTransport.FromBytes <PrimaryKey>(bytes);
                if (success)
                {
                    var data = serializer.Deserialize(transport.EventBytes, typeFinder.FindType(transport.EventTypeCode));
                    if (data is IEvent @event && transport.GrainId is PrimaryKey actorId)
                    {
                        var eventBase = EventBase.FromBytes(transport.BaseBytes);
                        var tellTask  = handler(serviceProvider, new FullyEvent <PrimaryKey>
                        {
                            StateId = actorId,
                            Base    = eventBase,
                            Event   = @event
                        });
                        if (!tellTask.IsCompletedSuccessfully)
                        {
                            return(tellTask.AsTask());
                        }
                    }
                }
                return(Task.CompletedTask);
            }

            Task BatchEventHandler(List <byte[]> list)
            {
                var groups =
                    list.Select(b => EventBytesTransport.FromBytes <PrimaryKey>(b))
                    .Where(o => o.success)
                    .Select(o => o.transport)
                    .GroupBy(o => o.GrainId);

                return(Task.WhenAll(groups.Select(async kv =>
                {
                    foreach (var transport in kv)
                    {
                        var data = serializer.Deserialize(transport.EventBytes, typeFinder.FindType(transport.EventTypeCode));
                        if (data is IEvent @event && transport.GrainId is PrimaryKey actorId)
                        {
                            var eventBase = EventBase.FromBytes(transport.BaseBytes);
                            var tellTask = handler(serviceProvider, new FullyEvent <PrimaryKey>
                            {
                                StateId = actorId,
                                Base = eventBase,
                                Event = @event
                            });
                            if (!tellTask.IsCompletedSuccessfully)
                            {
                                await tellTask;
                            }
                        }
                    }
                })));
            }
        }