コード例 #1
0
        public async Task FastForwardOnOutOfSyncWhenSimpleMode()
        {
            var channel = GenerateRandomChannelName();

            var client = new RtmClientBuilder(Config.Endpoint, Config.AppKey)
                         .SetConnector(ConnectAndFastForwardOnData)
                         .Build();

            var queue = client.CreateStateQueue();

            var obs = new TestSubscriptionObserverQueue(queue);

            obs.ObserveSubscriptionState();
            obs.ObserveSubscriptionPdu();

            client.OnError += ex =>
            {
                queue.Enqueue($"error:{ex.Message}");
            };

            RtmSubscriptionInfo subInfo = null;

            obs.OnSubscriptionInfo += (_, info) => subInfo = info;

            client.CreateSubscription(channel, SubscriptionModes.Simple, obs);

            client.Start();

            await queue.AssertDequeue(
                "rtm:created",
                "rtm:enter-unsubscribed",
                "leave-stopped",
                "enter-connecting",
                "leave-connecting",
                "rtm:leave-unsubscribed",
                "rtm:enter-subscribing",
                "enter-connected",
                "rtm:leave-subscribing",
                "rtm:enter-subscribed");

            // trigger subscription/info
            await client.Publish(channel, "msg", Ack.Yes);

            // on connected info
            Assert.That(await queue.Dequeue(), Is.EqualTo($"rtm:subscription-info:{RtmSubscriptionInfo.FastForward}"));

            var sub = await client.GetSubscription(channel);

            Assert.That(sub.Position, Is.EqualTo(null));
            Assert.That(subInfo.Position, Is.Not.EqualTo(null));

            await queue.AssertEmpty(client, millis : 200);

            await client.Dispose();
        }
コード例 #2
0
        public bool ProcessSubscriptionInfo(RtmSubscriptionInfo info)
        {
            Log.V("Processing subscription info, subscription: {0}, info: {1}", this, info);

            if (_state.ProcessSubscriptionInfo(info) != null)
            {
                this.NotifySubscriptionInfo(info);
                return(true);
            }

            return(false);
        }
コード例 #3
0
            public State ProcessSubscriptionInfo(RtmSubscriptionInfo info)
            {
                Log.V("Processing subscription info, state: {0}, info: {1}", this, info);
                if (IsSubscribed)
                {
                    if (_awaiter.IsCompleted)
                    {
                        Log.V("Subscription info ignored because state is completed, state: {0}, info: {1}", this, info);
                        return(null);
                    }

                    if (_fsm.IsTrackPosition && !string.IsNullOrEmpty(info.Position))
                    {
                        _fsm.Position = info.Position;
                    }

                    return(this);
                }

                Log.V("Subscription info ignored because state is not subscribed state, state: {0}, info: {1}", this, info);
                return(null);
            }
コード例 #4
0
 public void OnSubscriptionInfo(ISubscription subscription, RtmSubscriptionInfo info)
 {
     _observers.NotifySubscriptionInfo(subscription, info);
 }
コード例 #5
0
 void ISubscriptionObserver.OnSubscriptionInfo(ISubscription subscription, RtmSubscriptionInfo info)
 {
     OnSubscriptionInfo.InvokeSafe(subscription, info);
 }
コード例 #6
0
 public static void NotifySubscriptionInfo(this SubscriptionFuture future, RtmSubscriptionInfo info)
 {
     future?.Observer.NotifySubscriptionInfo(future, info);
 }
コード例 #7
0
        public static void NotifySubscriptionInfo(this IEnumerable <ISubscriptionObserver> observers, ISubscription subscription, RtmSubscriptionInfo info)
        {
            if (observers == null)
            {
                return;
            }

            foreach (var observer in observers)
            {
                try
                {
                    observer.OnSubscriptionInfo(subscription, info);
                }
                catch (Exception ex)
                {
                    UnhandledExceptionWatcher.Swallow(ex);
                }
            }
        }
コード例 #8
0
 public static void NotifySubscriptionInfo(this ISubscriptionObserver observer, ISubscription subscription, RtmSubscriptionInfo info)
 {
     if (observer != null)
     {
         observer.OnSubscriptionInfo(subscription, info);
     }
 }