示例#1
0
 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);
示例#2
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);
            }
        }
示例#3
0
 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);
 }
示例#4
0
 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);
 }
示例#5
0
 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);
             }
         }
     }
 }
示例#6
0
        /// <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));
        }
示例#7
0
 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);
             }
         }
     }
 }
示例#8
0
 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);
 }
示例#9
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;
                            }
                        }
                    }
                })));
            }
        }