/// <summary>
                /// Called when the state was persisted.
                /// </summary>
                public void OnSaved()
                {
                    _registry.TruncateLoggedEntities(_snapshot);

                    foreach (var entity in _snapshot.Entities)
                    {
                        entity.OnPersisted();
                    }

                    foreach (var subject in _snapshot.Subjects.Values)
                    {
                        if (subject.Instance is IStatefulOperator op)
                        {
                            op.OnStateSaved();
                        }
                    }

                    foreach (var subscription in _snapshot.Subscriptions.Values)
                    {
                        var instance = subscription.Instance;
                        if (instance != null)
                        {
                            SubscriptionStateVisitor.OnStateSaved(instance);
                        }
                    }
                }
                /// <summary>
                /// Predicate defining whether the subscription state should be included in the checkpoint.
                /// </summary>
                /// <param name="entity">The entity.</param>
                /// <returns>
                /// True if should be included.
                /// </returns>
                protected override bool ShouldSaveSubscriptionState(SubscriptionEntity entity)
                {
                    Debug.Assert(entity != null, "Entity should not be null.");

                    var instance = entity.Instance;

                    if (instance != null)
                    {
                        return(SubscriptionStateVisitor.HasStateChanged(instance));
                    }

                    return(false);
                }
                /// <summary>
                /// Saves subscription runtime state.
                /// </summary>
                /// <param name="entity">The entity to save.</param>
                /// <param name="stream">The stream to save to.</param>
                protected virtual void SaveSubscriptionState(SubscriptionEntity entity, Stream stream)
                {
                    Debug.Assert(entity != null, "Entity should not be null.");
                    Debug.Assert(stream != null, "Stream should not be null.");

                    var instance = entity.Instance;

                    if (instance != null)
                    {
                        var policy = _engine.Parent._serializationPolicy;

                        using (entity.Measure(EntityMetric.SaveState))
                        {
                            using var operatorStateWriter = new OperatorStateWriterFactory(stream, policy);

                            operatorStateWriter.WriteHeader();

                            SubscriptionStateVisitor.SaveState(instance, operatorStateWriter);
                        }
                    }
                }
示例#4
0
        public void SubscriptionStateVisitor_Basics()
        {
            var state         = new MockOperatorStateContainer();
            var writerFactory = state.CreateWriter();
            var readerFactory = state.CreateReader();

            var xs = new SimpleSubject <int>();
            var o  = xs.CreateObserver();

            var ys = new Take <int>(xs, 5);

            {
                var s1 = ys.Subscribe(Observer.Create <int>(_ => { }, _ => { }, () => { }));
                var v  = new SubscriptionInitializeVisitor(s1);
                v.Subscribe();
                v.Start();

                o.OnNext(42);
                o.OnNext(43);

                var sv = new SubscriptionStateVisitor(s1);

                Assert.IsTrue(sv.HasStateChanged());

                sv.SaveState(writerFactory);

                Assert.IsTrue(sv.HasStateChanged());

                sv.OnStateSaved();

                Assert.IsFalse(sv.HasStateChanged());

                o.OnNext(44);
                o.OnNext(45);

                Assert.IsTrue(sv.HasStateChanged());
            }

            {
                var done = false;

                var s2 = ys.Subscribe(Observer.Create <int>(_ => { }, _ => { }, () => { done = true; }));

                var sv = new SubscriptionStateVisitor(s2);

                sv.LoadState(readerFactory);

                var v = new SubscriptionInitializeVisitor(s2);
                v.Subscribe();
                v.Start();

                o.OnNext(46);
                Assert.IsFalse(done);

                o.OnNext(47);
                Assert.IsFalse(done);

                o.OnNext(48);
                Assert.IsTrue(done);
            }
        }
        public override void Accept(ISubscription subscription)
        {
            var visitor = new SubscriptionStateVisitor(subscription);

            visitor.SaveState(_state.CreateWriter());
        }
        public override void Accept(ISubscription subscription)
        {
            var visitor = new SubscriptionStateVisitor(subscription);

            visitor.LoadState(_state.CreateReader());
        }