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; });
private void DisposeSubscription(ObSubscription sub) { if (!_subscriptions.TryRemove(sub.Id, out _)) { return; //Most likely, previously removed due to failure } Swallow.Everything(() => sub.Observer.OnCompleted()); }
private void DisposeSubscription(SubscriptionInfo subscriptionInfo) { if (_isDisposed) { return; } Swallow.Everything(() => Unsub(subscriptionInfo)); }
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; });
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); }
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)); } } }
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()); } } }