public async Task OnNext(Immutable <List <byte[]> > items) { var events = items.Value.Select(bytes => { var(success, transport) = EventBytesTransport.FromBytesWithNoId(bytes); if (success) { var eventType = TypeContainer.GetType(transport.EventTypeCode); var data = Serializer.Deserialize(transport.EventBytes, eventType); if (data is IEvent @event) { var eventBase = EventBase.FromBytes(transport.BaseBytes); if (eventBase.Version > Snapshot.Base.Version) { return(new FullyEvent <PrimaryKey> { StateId = GrainId, Base = eventBase, Event = @event }); } } else { if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace("Non-Event: {0}->{1}->{2}", GrainType.FullName, GrainId.ToString(), Serializer.Serialize(data, eventType)); } } } return(default);
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 Task Tell(byte[] bytes) { var(success, transport) = EventBytesTransport.FromBytesWithNoId(bytes); if (success) { var eventType = TypeContainer.GetType(transport.EventType); var data = Serializer.Deserialize(eventType, transport.EventBytes); if (data is IEvent @event) { var eventBase = EventBase.FromBytes(transport.BaseBytes); if (eventBase.Version > Snapshot.Base.Version) { var tellTask = Tell(new FullyEvent <PrimaryKey> { StateId = GrainId, Base = eventBase, Event = @event }); if (!tellTask.IsCompletedSuccessfully) { return(tellTask.AsTask()); } } } else { if (Logger.IsEnabled(LogLevel.Information)) { Logger.LogInformation("Receive non-event messages, grain Id = {0} ,message type = {1}", GrainId.ToString(), transport.EventType); } } } return(Task.CompletedTask); }
public Task OnNext(Immutable <byte[]> bytes) { var(success, transport) = EventBytesTransport.FromBytesWithNoId(bytes.Value); if (success) { var eventType = TypeContainer.GetType(transport.EventTypeCode); var data = Serializer.Deserialize(transport.EventBytes, eventType); if (data is IEvent @event) { var eventBase = EventBase.FromBytes(transport.BaseBytes); if (eventBase.Version > Snapshot.Base.Version) { var tellTask = Tell(new FullyEvent <PrimaryKey> { StateId = GrainId, Base = eventBase, Event = @event }); if (!tellTask.IsCompletedSuccessfully) { return(tellTask.AsTask()); } } } else { if (Logger.IsEnabled(LogLevel.Information)) { Logger.LogInformation("Non-event messages:{0}({1})", eventType, Serializer.Serialize(data)); } } } return(Task.CompletedTask); }
public async Task OnNext(Immutable <byte[]> bytes) { var(success, transport) = EventBytesTransport.FromBytesWithNoId(bytes.Value); if (success) { var data = Serializer.Deserialize(TypeContainer.GetType(transport.EventTypeCode), transport.EventBytes); if (data is IEvent @event) { var eventBase = EventBase.FromBytes(transport.BaseBytes); if (eventBase.Version > Snapshot.Version) { if (concurrent) { var input = new AsyncInputEvent <IFullyEvent <PrimaryKey>, bool>(new FullyEvent <PrimaryKey> { StateId = GrainId, Base = eventBase, Event = @event }); var writeTask = ConcurrentChannel.WriteAsync(input); if (!writeTask.IsCompletedSuccessfully) { await writeTask; } if (!writeTask.Result) { var ex = new ChannelUnavailabilityException(GrainId.ToString(), GrainType); Logger.LogError(ex, ex.Message); throw ex; } await input.TaskSource.Task; } else { var tellTask = Tell(new FullyEvent <PrimaryKey> { StateId = GrainId, Base = eventBase, Event = @event }); if (!tellTask.IsCompletedSuccessfully) { await tellTask; } } } } else { if (Logger.IsEnabled(LogLevel.Information)) { Logger.LogInformation("Receive non-event messages, grain Id = {0} ,message type = {1}", GrainId.ToString(), transport.EventTypeCode); } } } }
/// <summary> /// 防止对象在State和BackupState中互相干扰,所以反序列化一个全新的Event对象给BackupState /// </summary> /// <param name="fullyEvent">事件本体</param> /// <param name="bytes">事件序列化之后的二进制数据</param> protected override ValueTask OnRaiseSuccessed(IFullyEvent <PrimaryKey> fullyEvent, EventBytesTransport bytesTransport) { var copiedEvent = new FullyEvent <PrimaryKey> { Event = Serializer.Deserialize(fullyEvent.Event.GetType(), bytesTransport.EventBytes) as IEvent, Base = EventBase.FromBytes(bytesTransport.BaseBytes) }; EventHandler.Apply(BackupSnapshot, copiedEvent); BackupSnapshot.Base.FullUpdateVersion(copiedEvent.Base, GrainType);//更新处理完成的Version //父级涉及状态归档 return(base.OnRaiseSuccessed(fullyEvent, bytesTransport)); }
public async Task ConcurrentTell(byte[] bytes) { var(success, transport) = EventBytesTransport.FromBytesWithNoId(bytes); if (success) { var data = Serializer.Deserialize(TypeContainer.GetType(transport.EventType), transport.EventBytes); if (data is IEvent @event) { var eventBase = EventBase.FromBytes(transport.BaseBytes); if (eventBase.Version > Snapshot.Version) { var writeTask = ConcurrentChannel.WriteAsync(new DataAsyncWrapper <IFullyEvent <PrimaryKey>, bool>(new FullyEvent <PrimaryKey> { StateId = GrainId, Base = eventBase, Event = @event })); if (!writeTask.IsCompletedSuccessfully) { await writeTask; } if (!writeTask.Result) { var ex = new ChannelUnavailabilityException(GrainId.ToString(), GrainType); if (Logger.IsEnabled(LogLevel.Error)) { Logger.LogError(LogEventIds.TransactionGrainCurrentInput, ex, ex.Message); } throw ex; } } } else { if (Logger.IsEnabled(LogLevel.Information)) { Logger.LogInformation(LogEventIds.FollowEventProcessing, "Receive non-event messages, grain Id = {0} ,message type = {1}", GrainId.ToString(), transport.EventType); } } } }
public Task OnNext(Immutable <byte[]> bytes) { var(success, transport) = EventBytesTransport.FromBytesWithNoId(bytes.Value); if (success) { var eventType = TypeContainer.GetType(transport.EventTypeCode); var data = Serializer.Deserialize(transport.EventBytes, eventType); if (data is IEvent @event) { var eventBase = EventBase.FromBytes(transport.BaseBytes); if (eventBase.Version > Snapshot.Base.Version) { var tellTask = Tell(new FullyEvent <PrimaryKey> { StateId = GrainId, Base = eventBase, Event = @event }); if (!tellTask.IsCompletedSuccessfully) { return(tellTask.AsTask()); } } if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace("OnNext completed: {0}->{1}->{2}", GrainType.FullName, GrainId.ToString(), Serializer.Serialize(data, eventType)); } } else { if (Logger.IsEnabled(LogLevel.Trace)) { Logger.LogTrace("Non-Event: {0}->{1}->{2}", GrainType.FullName, GrainId.ToString(), Serializer.Serialize(data, eventType)); } } } return(Task.CompletedTask); }
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; } } } }))); } }