示例#1
0
文件: AccountFlow.cs 项目: zszqwe/Ray
 protected override async ValueTask OnEventDelivered(IFullyEvent <long> fully)
 {
     switch (fully.Event)
     {
     case AmountTransferEvent value: await AmountAddEventHandler(value); break;
     }
 }
示例#2
0
文件: MainGrain.cs 项目: pangfd/Ray
        protected async ValueTask EventArchive(IFullyEvent <PrimaryKey> @event)
        {
            if (NewArchive == default)
            {
                NewArchive = new ArchiveBrief
                {
                    Id             = await ServiceProvider.GetService <IGrainFactory>().GetGrain <IUID>(GrainType.FullName).NewUtcID(),
                    StartTimestamp = @event.Base.Timestamp,
                    StartVersion   = @event.Base.Version,
                    Index          = LastArchive != default ? LastArchive.Index + 1 : 0,
                    EndTimestamp   = @event.Base.Timestamp,
                    EndVersion     = @event.Base.Version
                };
            }
            else
            {
                //判定有没有时间戳小于前一个归档
                if (NewArchive.StartTimestamp == 0 || @event.Base.Timestamp < NewArchive.StartTimestamp)
                {
                    NewArchive.StartTimestamp = @event.Base.Timestamp;
                }
                if (@event.Base.Timestamp > NewArchive.StartTimestamp)
                {
                    NewArchive.EndTimestamp = @event.Base.Timestamp;
                }
                NewArchive.EndVersion = @event.Base.Version;
            }
            var archiveTask = Archive();

            if (!archiveTask.IsCompletedSuccessfully)
            {
                await archiveTask;
            }
        }
示例#3
0
文件: FollowGrain.cs 项目: zszqwe/Ray
        protected async ValueTask Tell(IFullyEvent <PrimaryKey> @event)
        {
            if (Logger.IsEnabled(LogLevel.Trace))
            {
                Logger.LogTrace(LogEventIds.FollowEventProcessing, "Start event handling, grain Id = {0} and state version = {1},event type = {2} ,event = {3}", GrainId.ToString(), Snapshot.Version, @event.GetType().FullName, Serializer.SerializeToString(@event));
            }
            try
            {
                if (@event.Base.Version == Snapshot.Version + 1)
                {
                    var onEventDeliveredTask = OnEventDelivered(@event);
                    if (!onEventDeliveredTask.IsCompletedSuccessfully)
                    {
                        await onEventDeliveredTask;
                    }
                    Snapshot.FullUpdateVersion(@event.Base, GrainType);//更新处理完成的Version
                }
                else if (@event.Base.Version > Snapshot.Version)
                {
                    var eventList = await EventStorage.GetList(GrainId, Snapshot.StartTimestamp, Snapshot.Version + 1, @event.Base.Version - 1);

                    foreach (var evt in eventList)
                    {
                        var onEventDeliveredTask = OnEventDelivered(evt);
                        if (!onEventDeliveredTask.IsCompletedSuccessfully)
                        {
                            await onEventDeliveredTask;
                        }
                        Snapshot.FullUpdateVersion(evt.Base, GrainType);//更新处理完成的Version
                    }
                }
                if (@event.Base.Version == Snapshot.Version + 1)
                {
                    var onEventDeliveredTask = OnEventDelivered(@event);
                    if (!onEventDeliveredTask.IsCompletedSuccessfully)
                    {
                        await onEventDeliveredTask;
                    }
                    Snapshot.FullUpdateVersion(@event.Base, GrainType);//更新处理完成的Version
                }
                if (@event.Base.Version > Snapshot.Version)
                {
                    throw new EventVersionNotMatchStateException(GrainId.ToString(), GrainType, @event.Base.Version, Snapshot.Version);
                }
                await SaveSnapshotAsync();

                if (Logger.IsEnabled(LogLevel.Trace))
                {
                    Logger.LogTrace(LogEventIds.FollowEventProcessing, "Event Handling Completion, grain Id ={0} and state version = {1},event type = {2}", GrainId.ToString(), Snapshot.Version, @event.GetType().FullName);
                }
            }
            catch (Exception ex)
            {
                if (Logger.IsEnabled(LogLevel.Critical))
                {
                    Logger.LogCritical(LogEventIds.FollowEventProcessing, ex, "FollowGrain Event handling failed with Id = {0},event = {1}", GrainId.ToString(), Serializer.SerializeToString(@event));
                }
                throw;
            }
        }
示例#4
0
 protected override async ValueTask OnEventDelivered(IFullyEvent <long> fully)
 {
     switch (fully.Event)
     {
     case AmountTransferEvent value: await AmountAddEventHandler(value, new EventUID(fully.GetEventId(), fully.Base.Timestamp)); break;
     }
 }
示例#5
0
文件: MainGrain.cs 项目: pangfd/Ray
 protected virtual ValueTask OnRaiseSuccessed(IFullyEvent <PrimaryKey> @event, EventBytesTransport bytesTransport)
 {
     if (ArchiveOptions.On)
     {
         return(EventArchive(@event));
     }
     return(Consts.ValueTaskDone);
 }
示例#6
0
文件: MainGrain.cs 项目: pangfd/Ray
 protected virtual ValueTask OnRaiseFailed(IFullyEvent <PrimaryKey> @event)
 {
     if (ArchiveOptions.On && NewArchive != default)
     {
         return(Archive());
     }
     return(Consts.ValueTaskDone);
 }
示例#7
0
 protected virtual ValueTask OnEventDelivered(IFullyEvent <PrimaryKey> @event)
 {
     if (Logger.IsEnabled(LogLevel.Trace))
     {
         Logger.LogTrace("OnEventDelivered: {0}({1})", @event.GetType().FullName, Serializer.Serialize(@event, @event.GetType()));
     }
     SnapshotHandler.Apply(Snapshot, @event);
     return(Consts.ValueTaskDone);
 }
示例#8
0
 protected virtual ValueTask OnEventDelivered(IFullyEvent <PrimaryKey> @event)
 {
     if (SnapshotEventVersion > 0 && Snapshot.Version > 0 && @event.Base.Timestamp < Snapshot.StartTimestamp)
     {
         return(new ValueTask(ObserverSnapshotStorage.UpdateStartTimestamp(Snapshot.StateId, @event.Base.Timestamp)));
     }
     else
     {
         return(Consts.ValueTaskDone);
     }
 }
示例#9
0
        public override void CustomApply(Snapshot <long, AccountState> snapshot, IFullyEvent <long> fullyEvent)
        {
            switch (fullyEvent.Event)
            {
            case AmountAddEvent value: AmountAddEventHandle(snapshot.State, value); break;

            case AmountTransferEvent value: AmountTransferEventHandle(snapshot.State, value); break;

            default: break;
            }
        }
示例#10
0
        public void Apply(Snapshot <long, AccountState> state, IFullyEvent <long> fully)
        {
            switch (fully.Event)
            {
            case AmountAddEvent value: AmountAddEventHandle(state.State, value); break;

            case AmountTransferEvent value: AmountTransferEventHandle(state.State, value); break;

            default: break;
            }
        }
示例#11
0
 protected virtual ValueTask OnEventDelivered(IFullyEvent <PrimaryKey> @event)
 {
     try
     {
         SnapshotHandler.Apply(Snapshot, @event);
     }
     catch (Exception ex)
     {
         Logger.LogCritical(ex, "Delivered failed: {0}->{1}->{2}", GrainType.FullName, GrainId.ToString(), Serializer.Serialize(@event, @event.GetType()));
     }
     return(Consts.ValueTaskDone);
 }
示例#12
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));
        }
示例#13
0
 public Task <bool> Append(IFullyEvent <PrimaryKey> fullyEvent, EventBytesTransport bytesTransport, string unique)
 {
     return(Task.Run(async() =>
     {
         var wrap = new AsyncInputEvent <BatchAppendTransport <PrimaryKey>, bool>(new BatchAppendTransport <PrimaryKey>(fullyEvent, bytesTransport, unique));
         var writeTask = mpscChannel.WriteAsync(wrap);
         if (!writeTask.IsCompletedSuccessfully)
         {
             await writeTask;
         }
         return await wrap.TaskSource.Task;
     }));
 }
示例#14
0
文件: MainGrain.cs 项目: pangfd/Ray
        protected virtual async ValueTask OnRaiseStart(IFullyEvent <PrimaryKey> @event)
        {
            if (Snapshot.Base.Version == 0)
            {
                return;
            }
            if (Snapshot.Base.IsLatest)
            {
                await SnapshotStorage.UpdateIsLatest(Snapshot.Base.StateId, false);

                Snapshot.Base.IsLatest = false;
            }
            if (ClearedArchive != default && @event.Base.Timestamp < ClearedArchive.StartTimestamp)
            {
                throw new EventIsClearedException(@event.GetType().FullName, Serializer.SerializeToString(@event), ClearedArchive.Index);
            }
            if (SnapshotEventVersion > 0)
            {
                if (@event.Base.Timestamp < Snapshot.Base.LatestMinEventTimestamp)
                {
                    await SnapshotStorage.UpdateLatestMinEventTimestamp(Snapshot.Base.StateId, @event.Base.Timestamp);
                }
                if (@event.Base.Timestamp < Snapshot.Base.StartTimestamp)
                {
                    await SnapshotStorage.UpdateStartTimestamp(Snapshot.Base.StateId, @event.Base.Timestamp);
                }
            }
            if (ArchiveOptions.On &&
                LastArchive != default &&
                @event.Base.Timestamp < LastArchive.EndTimestamp)
            {
                foreach (var archive in BriefArchiveList.Where(a => @event.Base.Timestamp < a.EndTimestamp && !a.EventIsCleared).OrderByDescending(v => v.Index))
                {
                    if (@event.Base.Timestamp < archive.EndTimestamp)
                    {
                        await DeleteArchive(archive.Id);

                        if (NewArchive != default)
                        {
                            NewArchive = CombineArchiveInfo(archive, NewArchive);
                        }
                        else
                        {
                            NewArchive = archive;
                        }
                        BriefArchiveList.Remove(archive);
                    }
                }
                LastArchive = BriefArchiveList.LastOrDefault();
            }
        }
示例#15
0
        protected virtual async ValueTask EventDelivered(IFullyEvent <PrimaryKey> fullyEvent)
        {
            if (SnapshotEventVersion > 0 &&
                Snapshot.Version > 0 &&
                fullyEvent.Base.Timestamp < Snapshot.StartTimestamp)
            {
                await ObserverSnapshotStorage.UpdateStartTimestamp(Snapshot.StateId, fullyEvent.Base.Timestamp);
            }
            var task = OnEventDelivered(fullyEvent);

            if (!task.IsCompletedSuccessfully)
            {
                await task;
            }
        }
示例#16
0
        protected async ValueTask Tell(IFullyEvent <PrimaryKey> @event)
        {
            try
            {
                if (@event.Base.Version == Snapshot.Base.Version + 1)
                {
                    var onEventDeliveredTask = OnEventDelivered(@event);
                    if (!onEventDeliveredTask.IsCompletedSuccessfully)
                    {
                        await onEventDeliveredTask;
                    }
                    Snapshot.Base.FullUpdateVersion(@event.Base, GrainType);//更新处理完成的Version
                }
                else if (@event.Base.Version > Snapshot.Base.Version)
                {
                    var eventList = await EventStorage.GetList(GrainId, Snapshot.Base.StartTimestamp, Snapshot.Base.Version + 1, @event.Base.Version - 1);

                    foreach (var evt in eventList)
                    {
                        var onEventDeliveredTask = OnEventDelivered(evt);
                        if (!onEventDeliveredTask.IsCompletedSuccessfully)
                        {
                            await onEventDeliveredTask;
                        }
                        Snapshot.Base.FullUpdateVersion(evt.Base, GrainType);//更新处理完成的Version
                    }
                }
                if (@event.Base.Version == Snapshot.Base.Version + 1)
                {
                    var onEventDeliveredTask = OnEventDelivered(@event);
                    if (!onEventDeliveredTask.IsCompletedSuccessfully)
                    {
                        await onEventDeliveredTask;
                    }
                    Snapshot.Base.FullUpdateVersion(@event.Base, GrainType);//更新处理完成的Version
                }
                if (@event.Base.Version > Snapshot.Base.Version)
                {
                    throw new EventVersionUnorderedException(GrainId.ToString(), GrainType, @event.Base.Version, Snapshot.Base.Version);
                }
            }
            catch (Exception ex)
            {
                Logger.LogCritical(ex, "{0}({1})", @event.GetType().FullName, Serializer.Serialize(@event, @event.GetType()));
                throw;
            }
        }
示例#17
0
        public virtual void Apply(Snapshot <PrimaryKey, Snapshot> snapshot, IFullyEvent <PrimaryKey> fullyEvent)
        {
            var eventType = fullyEvent.Event.GetType();

            if (_handlerDict.TryGetValue(eventType, out var fun))
            {
                fun(snapshot.State, fullyEvent.Event);
            }
            else if (_handlerDict_1.TryGetValue(eventType, out var fun_1))
            {
                fun_1(snapshot.State, fullyEvent.Event, fullyEvent.Base);
            }
            else if (handlerAttribute == default || !handlerAttribute.Ignores.Contains(eventType))
            {
                throw new EventNotFoundHandlerException(eventType);
            }
        }
示例#18
0
        protected virtual ValueTask OnEventDelivered(IFullyEvent <PrimaryKey> fullyEvent)
        {
            var eventType = fullyEvent.Event.GetType();

            if (_handlerDict_0.TryGetValue(eventType, out var func))
            {
                return(new ValueTask(func(this, fullyEvent.Event)));
            }
            else if (_handlerDict_1.TryGetValue(eventType, out var func_1))
            {
                return(new ValueTask(func_1(this, fullyEvent.Event, fullyEvent.Base)));
            }
            else if (handlerAttribute == default || !handlerAttribute.Ignores.Contains(eventType))
            {
                throw new EventNotFoundHandlerException(eventType);
            }
            return(Consts.ValueTaskDone);
        }
示例#19
0
        protected override async ValueTask OnEventDelivered(IFullyEvent <K> @event)
        {
            var task = Process(@event);

            if (!task.IsCompletedSuccessfully)
            {
                await task.AsTask().ContinueWith(t =>
                {
                    if (t.Exception != null)
                    {
                        if (!(t.Exception.InnerException is Npgsql.PostgresException e && e.SqlState == "23505"))
                        {
                            ExceptionDispatchInfo.Capture(t.Exception).Throw();
                        }
                    }
                });
            }
        }
示例#20
0
        public void Apply(Snapshot <PrimaryKey, Snapshot> snapshot, IFullyEvent <PrimaryKey> fullyEvent)
        {
            switch (fullyEvent.Event)
            {
            case TransactionFinishEvent _:
            {
                snapshot.Base.ClearTransactionInfo(false);
            }; break;

            case TransactionCommitEvent transactionCommitEvent:
            {
                snapshot.Base.TransactionStartVersion   = transactionCommitEvent.StartVersion;
                snapshot.Base.TransactionStartTimestamp = transactionCommitEvent.StartTimestamp;
                snapshot.Base.TransactionId             = transactionCommitEvent.Id;
            }; break;

            default: CustomApply(snapshot, fullyEvent); break;
            }
        }
示例#21
0
文件: DbGrain.cs 项目: zz110/Ray
        protected override async ValueTask EventDelivered(IFullyEvent <K> @event)
        {
            var task = base.EventDelivered(@event);

            if (!task.IsCompletedSuccessfully)
            {
                try
                {
                    await task;
                }
                catch (Exception ex)
                {
                    if (!(ex is Npgsql.PostgresException e && e.SqlState == "23505"))
                    {
                        throw;
                    }
                }
            }
        }
示例#22
0
        protected override async ValueTask OnEventDelivered(IFullyEvent <K> @event)
        {
            var task = Process(@event);

            if (!task.IsCompletedSuccessfully)
            {
                try
                {
                    await task;
                }
                catch (Exception ex)
                {
                    if (!(ex is Npgsql.PostgresException e && e.SqlState == "23505"))
                    {
                        ExceptionDispatchInfo.Capture(ex).Throw();
                    }
                }
            }
        }
示例#23
0
        public override void Apply(Snapshot <PrimaryKey, Snapshot> snapshot, IFullyEvent <PrimaryKey> fullyEvent)
        {
            switch (fullyEvent.Event)
            {
            case TxFinishedEvent _:
            {
                if (snapshot.Base is TxSnapshotBase <PrimaryKey> snapshotBase)
                {
                    snapshotBase.ClearTransactionInfo(false);
                }
                else
                {
                    throw new SnapshotNotSupportTxException(snapshot.GetType());
                }
            }; break;

            case TxCommitEvent transactionCommitEvent:
            {
                if (snapshot.Base is TxSnapshotBase <PrimaryKey> snapshotBase)
                {
                    snapshotBase.TransactionStartVersion   = transactionCommitEvent.StartVersion;
                    snapshotBase.TransactionStartTimestamp = transactionCommitEvent.StartTimestamp;
                    snapshotBase.TransactionId             = transactionCommitEvent.Id;
                }
                else
                {
                    throw new SnapshotNotSupportTxException(snapshot.GetType());
                }
            }; break;

            default:
            {
                //如果产生非事务相关的事件,说明事务事件已被清理,应该执行一次清理动作
                if (snapshot.Base is TxSnapshotBase <PrimaryKey> snapshotBase && snapshotBase.TransactionStartVersion != -1)
                {
                    snapshotBase.ClearTransactionInfo(false);
                }
                CustomApply(snapshot, fullyEvent);
            }; break;
            }
        }
示例#24
0
        protected async ValueTask Tell(IFullyEvent <PrimaryKey> @event)
        {
            if (@event.Base.Version == Snapshot.Base.Version + 1)
            {
                var onEventDeliveredTask = OnEventDelivered(@event);
                if (!onEventDeliveredTask.IsCompletedSuccessfully)
                {
                    await onEventDeliveredTask;
                }
                Snapshot.Base.FullUpdateVersion(@event.Base, GrainType);//更新处理完成的Version
            }
            else if (@event.Base.Version > Snapshot.Base.Version)
            {
                var eventList = await EventStorage.GetList(GrainId, Snapshot.Base.StartTimestamp, Snapshot.Base.Version + 1, @event.Base.Version - 1);

                foreach (var evt in eventList)
                {
                    var onEventDeliveredTask = OnEventDelivered(evt);
                    if (!onEventDeliveredTask.IsCompletedSuccessfully)
                    {
                        await onEventDeliveredTask;
                    }
                    Snapshot.Base.FullUpdateVersion(evt.Base, GrainType);//更新处理完成的Version
                }
            }
            if (@event.Base.Version == Snapshot.Base.Version + 1)
            {
                var onEventDeliveredTask = OnEventDelivered(@event);
                if (!onEventDeliveredTask.IsCompletedSuccessfully)
                {
                    await onEventDeliveredTask;
                }
                Snapshot.Base.FullUpdateVersion(@event.Base, GrainType);//更新处理完成的Version
            }
            if (@event.Base.Version > Snapshot.Base.Version)
            {
                throw new EventVersionUnorderedException(GrainId.ToString(), GrainType, @event.Base.Version, Snapshot.Base.Version);
            }
        }
示例#25
0
 public virtual void CustomApply(Snapshot <PrimaryKey, Snapshot> snapshot, IFullyEvent <PrimaryKey> fullyEvent)
 {
     base.Apply(snapshot, fullyEvent);
 }
示例#26
0
 protected virtual ValueTask OnEventDelivered(IFullyEvent <PrimaryKey> @event)
 {
     Snapshot.Apply(EventHandler, @event);
     return(Consts.ValueTaskDone);
 }
示例#27
0
 public static EventUID GetNextUID <K>(this IFullyEvent <K> @event)
 {
     return(new EventUID(@event.GetEventId(), @event.Base.Timestamp));
 }
示例#28
0
 public static string GetEventId <K>(this IFullyEvent <K> @event)
 {
     return($"{@event.StateId.ToString()}_{@event.Base.Version.ToString()}");
 }
示例#29
0
        public static void Apply <PrimaryKey, SnapshotType>(this Snapshot <PrimaryKey, SnapshotType> snapshot, IEventHandler <PrimaryKey, SnapshotType> handler, IFullyEvent <PrimaryKey> fullyEvent)
            where SnapshotType : class, new()
        {
            switch (fullyEvent.Event)
            {
            case TransactionFinishEvent _:
            {
                snapshot.Base.ClearTransactionInfo(false);
            }; break;

            case TransactionCommitEvent transactionCommitEvent:
            {
                snapshot.Base.TransactionStartVersion   = transactionCommitEvent.StartVersion;
                snapshot.Base.TransactionStartTimestamp = transactionCommitEvent.StartTimestamp;
                snapshot.Base.TransactionId             = transactionCommitEvent.Id;
            }; break;

            default: handler.Apply(snapshot, fullyEvent); break;
            }
        }
示例#30
0
 public Task <bool> Append(IFullyEvent <PrimaryKey> fullyEvent, in EventBytesTransport bytesTransport, string unique)