private async Task RegisterAsStreamProducer(StreamId streamId, StreamSequenceToken streamStartToken) { try { if (pubSub == null) { throw new NullReferenceException("Found pubSub reference not set up correctly in RetreaveNewStream"); } IStreamProducerExtension meAsStreamProducer = StreamProducerExtensionFactory.Cast(this.AsReference()); ISet <PubSubSubscriptionState> streamData = await pubSub.RegisterProducer(streamId, streamProviderName, meAsStreamProducer); if (logger.IsVerbose) { logger.Verbose((int)ErrorCode.PersistentStreamPullingAgent_16, "Got back {0} Subscribers for stream {1}.", streamData.Count, streamId); } foreach (PubSubSubscriptionState item in streamData) { var token = item.StreamSequenceToken ?? streamStartToken; AddSubscriber_Impl(item.SubscriptionId, item.Stream, item.Consumer, token, item.FilterWrapper); } } catch (Exception exc) { // RegisterAsStreamProducer is fired with .Ignore so we should log if anything goes wrong, because there is no one to catch the exception logger.Error((int)ErrorCode.PersistentStreamPullingAgent_17, "Ignored RegisterAsStreamProducer Error", exc); throw; } }
public async Task Shutdown() { // Stop pulling from queues that are not in my range anymore. logger.Info((int)ErrorCode.PersistentStreamPullingAgent_05, "Shutdown of {0} responsible for queue: {1}", this.GetType().Name, QueueId.ToStringWithHashCode()); if (timer != null) { var tmp = timer; timer = null; tmp.Dispose(); } var unregisterTasks = new List <Task>(); var meAsStreamProducer = StreamProducerExtensionFactory.Cast(this.AsReference()); foreach (var streamId in pubSubCache.Keys) { logger.Info((int)ErrorCode.PersistentStreamPullingAgent_06, "Unregister PersistentStreamPullingAgent Producer for stream {0}.", streamId); unregisterTasks.Add(pubSub.UnregisterProducer(streamId, streamProviderName, meAsStreamProducer)); } try { var task = OrleansTaskExtentions.SafeExecute(() => receiver.Shutdown(initQueueTimeout)); task = task.LogException(logger, ErrorCode.PersistentStreamPullingAgent_07, String.Format("QueueAdapterReceiver {0} failed to Shutdown.", QueueId)); await task; } catch (Exception) { // Just ignore this exception and proceed as if Shutdown has succeeded. // We already logged individual exceptions for individual calls to Shutdown. No need to log again. } try { await Task.WhenAll(unregisterTasks); } catch (Exception exc) { logger.Warn((int)ErrorCode.PersistentStreamPullingAgent_08, "Failed to unregister myself as stream producer to some streams taht used to be in my responsibility.", exc); } }