Beispiel #1
0
        private void DoSafeRelease() => Swallow.Everything(
            () =>
        {
            if (_cancellation == null)
            {
                return;
            }

            if (!_cancellation.IsCancellationRequested)
            {
                _cancellation.Cancel(false);
            }

            _cancellation = null;
        },
            () =>
        {
            if (_consumer == null)
            {
                return;
            }

            if (!_consumer.IsCompleted)
            {
                _consumer.Wait(WaitForConsumerCompleteMs);
            }

            _consumer = null;
        },
            () =>
        {
            _connection?.Dispose();
            _connection = null;
        });
Beispiel #2
0
 private void DisposeSubscription(ObSubscription sub)
 {
     if (!_subscriptions.TryRemove(sub.Id, out _))
     {
         return; //Most likely, previously removed due to failure
     }
     Swallow.Everything(() => sub.Observer.OnCompleted());
 }
Beispiel #3
0
        private void DisposeSubscription(SubscriptionInfo subscriptionInfo)
        {
            if (_isDisposed)
            {
                return;
            }

            Swallow.Everything(() => Unsub(subscriptionInfo));
        }
Beispiel #4
0
        private void DoSafeRelease() => Swallow.Everything(
            () =>
        {
            if (_cancellation == null)
            {
                return;
            }

            if (!_cancellation.IsCancellationRequested)
            {
                _cancellation.Cancel(false);
            }

            _cancellation.Dispose();
            _cancellation = null;
        },
            () =>
        {
            if (_consumer == null)
            {
                return;
            }

            if (!_consumer.IsCompleted)
            {
                _consumer.Wait(WaitForConsumerCompleteMs);
            }

            _consumer = null;
        },
            () =>
        {
            foreach (var key in _outstandingRequests.Keys)
            {
                if (_outstandingRequests.TryRemove(key, out var tcs))
                {
                    try
                    {
                        tcs.TrySetCanceled();
                    }
                    catch
                    {
                        // ignored
                    }
                }
            }
        },
            () =>
        {
            _connection?.Dispose();
            _connection = null;
        });
Beispiel #5
0
        private Subscription CreateMsgOpSubscription(SubscriptionInfo subscriptionInfo, Func <INatsObservable <MsgOp>, IDisposable> subscriptionFactory)
        {
            var subscription = Subscription.Create(
                subscriptionInfo,
                subscriptionFactory(MsgOpStream.Where(msg => subscriptionInfo.Matches(msg.Subject))),
                info => Swallow.Everything(() => Unsub(info)));

            if (!_subscriptions.TryAdd(subscription.SubscriptionInfo.Id, subscription))
            {
                throw NatsException.CouldNotCreateSubscription(subscription.SubscriptionInfo);
            }

            return(subscription);
        }
Beispiel #6
0
        public void Emit(T value)
        {
            foreach (var subscription in _subscriptions)
            {
                try
                {
                    subscription.Value.Observer.OnNext(value);
                }
                catch (Exception ex)
                {
                    Logger.Error("Error in observer while emitting value.", ex);

                    RemoveSubscription(subscription.Key);

                    Swallow.Everything(() => subscription.Value.Observer.OnError(ex));
                }
            }
        }
Beispiel #7
0
        public void Emit(T value)
        {
            ThrowIfDisposed();

            foreach (var subscription in _subscriptions.Values)
            {
                try
                {
                    subscription.Observer.OnNext(value);
                }
                catch (Exception ex)
                {
                    Logger.Error("Error in observer while emitting value. Observer subscription will be removed.", ex);

                    //No invoke of OnError as it's not the producer that is failing.
                    _subscriptions.TryRemove(subscription.Id, out _);

                    Swallow.Everything(() => subscription.Dispose());
                }
            }
        }