internal StreamSubscriptionHandleImpl <T> SetObserver <T>(GuidId subscriptionId, StreamImpl <T> stream, IAsyncObserver <T> observer, StreamSequenceToken token, IStreamFilterPredicateWrapper filter) { if (null == stream) { throw new ArgumentNullException("stream"); } if (null == observer) { throw new ArgumentNullException("observer"); } try { if (logger.IsVerbose) { logger.Verbose("{0} AddObserver for stream {1}", providerRuntime.ExecutingEntityIdentity(), stream.StreamId); } // Note: The caller [StreamConsumer] already handles locking for Add/Remove operations, so we don't need to repeat here. var handle = new StreamSubscriptionHandleImpl <T>(subscriptionId, observer, stream, filter, token); return(allStreamObservers.AddOrUpdate(subscriptionId, handle, (key, old) => handle) as StreamSubscriptionHandleImpl <T>); } catch (Exception exc) { logger.Error((int)ErrorCode.StreamProvider_AddObserverException, String.Format("{0} StreamConsumerExtension.AddObserver({1}) caugth exception.", providerRuntime.ExecutingEntityIdentity(), stream.StreamId), exc); throw; } }
internal void AddSubscribers(InternalStreamId streamId, ICollection <PubSubSubscriptionState> newSubscribers) { if (logger.IsEnabled(LogLevel.Debug)) { logger.LogDebug( "{Grain} AddSubscribers {NewSubscribers} for stream {StreamId}", providerRuntime.ExecutingEntityIdentity(), Utils.EnumerableToString(newSubscribers), streamId); } StreamConsumerExtensionCollection consumers; if (remoteConsumers.TryGetValue(streamId, out consumers)) { foreach (var newSubscriber in newSubscribers) { consumers.AddRemoteSubscriber(newSubscriber.SubscriptionId, newSubscriber.Consumer, newSubscriber.FilterData); } } else { // We got an item when we don't think we're the subscriber. This is a normal race condition. // We can drop the item on the floor, or pass it to the rendezvous, or log a warning. } }
internal StreamSubscriptionHandleImpl <T> SetObserver <T>(GuidId subscriptionId, StreamImpl <T> stream, IAsyncObserver <T> observer, IStreamFilterPredicateWrapper filter) { if (null == stream) { throw new ArgumentNullException("stream"); } if (null == observer) { throw new ArgumentNullException("observer"); } try { if (logger.IsVerbose) { logger.Verbose("{0} AddObserver for stream {1}", providerRuntime.ExecutingEntityIdentity(), stream); } // Note: The caller [StreamConsumer] already handles locking for Add/Remove operations, so we don't need to repeat here. IStreamObservers obs = allStreamObservers.GetOrAdd(subscriptionId, new ObserversCollection <T>()); var wrapper = new StreamSubscriptionHandleImpl <T>(subscriptionId, observer, stream, filter); ((ObserversCollection <T>)obs).SetObserver(wrapper); return(wrapper); } catch (Exception exc) { logger.Error((int)ErrorCode.StreamProvider_AddObserverException, String.Format("{0} StreamConsumerExtension.AddObserver({1}) caugth exception.", providerRuntime.ExecutingEntityIdentity(), stream), exc); throw; } }
internal StreamSubscriptionHandleImpl <T> SetObserver <T>( GuidId subscriptionId, StreamImpl <T> stream, IAsyncObserver <T> observer, IAsyncBatchObserver <T> batchObserver, StreamSequenceToken token, string filterData) { if (null == stream) { throw new ArgumentNullException("stream"); } try { if (logger.IsEnabled(LogLevel.Debug)) { logger.Debug("{0} AddObserver for stream {1}", providerRuntime.ExecutingEntityIdentity(), stream.InternalStreamId); } // Note: The caller [StreamConsumer] already handles locking for Add/Remove operations, so we don't need to repeat here. var handle = new StreamSubscriptionHandleImpl <T>(subscriptionId, observer, batchObserver, stream, token, filterData); return(allStreamObservers.AddOrUpdate(subscriptionId, handle, (key, old) => handle) as StreamSubscriptionHandleImpl <T>); } catch (Exception exc) { logger.Error(ErrorCode.StreamProvider_AddObserverException, $"{providerRuntime.ExecutingEntityIdentity()} StreamConsumerExtension.AddObserver({stream.InternalStreamId}) caugth exception.", exc); throw; } }