コード例 #1
0
        public static async Task <T> Apply <T>(this ICumulativeUpdate <T> update, Snapshot <T> snapshot) where T : ICloneable <T>, new()
        {
            var state = await snapshot.GetStateAsync();

            update.Apply(state);

            return(state);
        }
コード例 #2
0
        protected override Snapshot <T> ApplyUpdateInternal(long newVersionNumber, ICumulativeUpdate <T> update)
        {
            if (newVersionNumber <= VersionNumber)
            {
                throw new InvalidVersionException($"Can't apply update #{newVersionNumber} with base #{update.BaseVersionNumber} - current object version is already #{VersionNumber}");
            }

            return(new UnconfirmedSnapshot <T>(newVersionNumber, this, update));
        }
コード例 #3
0
        protected override Snapshot <T> ApplyUpdateInternal(long newVersionNumber, ICumulativeUpdate <T> update)
        {
            if (newVersionNumber == VersionNumber)
            {
                return(new ReliableSnapshot <T>(newVersionNumber, GetStateAsync()));
            }

            return(new UnconfirmedSnapshot <T>(newVersionNumber, _snapshot.ApplyUpdate(newVersionNumber, update), update));
        }
コード例 #4
0
ファイル: TrollActor.cs プロジェクト: alexrster/QX.Zoo
        public async Task <long> ApplyUpdateAsync(ICumulativeUpdate <T> cumulativeUpdate)
        {
            _log.LogInformation($"Begin apply update for base #{cumulativeUpdate.BaseVersionNumber} of type {cumulativeUpdate.GetType().Name}");

            var versionTuple = await _vendor.PromoteNewVersion(_bus, cumulativeUpdate.BaseVersionNumber);

            _log.LogVerbose($"Vendor promoted new version #{versionTuple.Item1} for base #{cumulativeUpdate.BaseVersionNumber}");

            await _bus.PublishMessageAsync(new VersionCumulativeUpdateNotification <T>(FactoryId, FactoryInstanceId, versionTuple.Item1, cumulativeUpdate));

            _log.LogVerbose($"Wait for initial verision #{versionTuple.Item1} to be confirmed or moved by other guys");
            return(await versionTuple.Item2);
        }
コード例 #5
0
        public async Task <long> ApplyUpdateAsync(ICumulativeUpdate <T> update)
        {
            using (_log.BeginScope($"{update.GetType().Name}:{update.BaseVersionNumber}"))
            {
                _log.LogInformation($"Start apply update for base #{update.BaseVersionNumber} of type {update.GetType().Name}");
                var versionNumberTask = _trollActor.ApplyUpdateAsync(update);
                if (await Task.WhenAny(versionNumberTask, Task.Delay(TimeSpan.FromSeconds(15))) != versionNumberTask)
                {
                    _log.LogError($"Version update confirmation for base #{update.BaseVersionNumber} has not been received during 15 seconds.");
                    throw new TimeoutException($"Version update confirmation for #{update.BaseVersionNumber} has not been received during 15 seconds.");
                }

                _log.LogInformation($"Finished apply update for base #{update.BaseVersionNumber} - new object version #{versionNumberTask.Result}");
                return(versionNumberTask.Result);
            }
        }
コード例 #6
0
ファイル: AttendeeActor.cs プロジェクト: alexrster/QX.Zoo
        public Task <long> ApplyUpdateAsync(ICumulativeUpdate <T> update)
        {
            throw new NotImplementedException();
            //if (_isInitialized == 0)
            //{
            //  throw new InvalidOperationException($"FrontEnt actor #{FactoryInstanceId} of factory '{FactoryId}' not initialized");
            //}

            //Trace.TraceVerbose($"Vendor actor #{FactoryInstanceId} of factory '{FactoryId}' apply update of type {update.GetType()} for base #{update.BaseVersionNumber}");

            //var snapshot = _librarian.ApplyUpdate(update);
            //Trace.TraceVerbose($"Vendor actor #{FactoryInstanceId} of factory '{FactoryId}' generated new verion #{snapshot.VersionNumber} for base #{update.BaseVersionNumber} using internal Vendor actor");

            //VersionAccumulator current;
            //_versions.Update(
            //  snapshot.VersionNumber,
            //  a => a.ConfirmVersion(FactoryInstanceId, update.BaseVersionNumber),
            //  out current);
            //Trace.TraceVerbose($"Vendor actor #{FactoryInstanceId} of factory '{FactoryId}' confirmed verion #{snapshot.VersionNumber} for base #{update.BaseVersionNumber}");

            //await _busEntity.PublishMessageAsync(new VersionCumulativeUpdateNotification<T>(this, snapshot.VersionNumber, update));

            //return snapshot.VersionNumber;
        }
コード例 #7
0
 public VersionCumulativeUpdateNotification(Guid factoryId, long factoryInstanceId, long versionNumber, ICumulativeUpdate <T> update)
     : base(factoryId, factoryInstanceId, versionNumber)
 {
     CumulativeUpdate = update;
 }
コード例 #8
0
 protected override Snapshot <T> ApplyUpdateInternal(long newVersionNumber, ICumulativeUpdate <T> update)
 {
     throw new InvalidVersionException($"Can't apply update #{newVersionNumber} on object instance #{VersionNumber} - object outdated");
 }
コード例 #9
0
ファイル: Snapshot.cs プロジェクト: alexrster/QX.Zoo
 protected abstract Snapshot ApplyUpdateInternal(long versionNumber, ICumulativeUpdate update);
コード例 #10
0
 public virtual Snapshot <T> UpdateSnapshot(ICumulativeUpdate <T> update, long newVersionNumber, out Snapshot <T> current)
 {
     return(_snapshots.AddOrUpdate(update.BaseVersionNumber, LoadSnapshot, s => s.ApplyUpdate(newVersionNumber, update), out current));
 }
コード例 #11
0
 public UnconfirmedSnapshot(long versionNumber, Snapshot <T> snapshot, ICumulativeUpdate <T> update) : base(versionNumber)
 {
     _update   = update;
     _snapshot = snapshot;
 }