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); } }
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)); } } }
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; } } } }))); } }