public IDisposable Subscribe(Endpoint endpoint, CallbackDelegate <BinaryMessage> callback, string messageType, string processingGroup, int priority) { var subscriptionHandler = new MultipleAssignmentDisposable(); Action <int> doSubscribe = null; doSubscribe = attemptNumber => { if (subscriptionHandler.IsDisposed) { return; } if (attemptNumber > 0) { m_Logger.Info("Resubscribing for endpoint {0}. Attempt# {1}", endpoint, attemptNumber); } else { m_Logger.Info("Subscribing for endpoint {0}", endpoint); } try { var procGroup = m_TransportManager.GetProcessingGroup(endpoint.TransportId, processingGroup ?? endpoint.Destination.ToString(), () => { m_Logger.Info("Subscription for endpoint {0} failure detected. Attempting subscribe again.", endpoint); doSubscribe(0); }); var subscription = procGroup.Subscribe(endpoint.Destination.Subscribe, (message, ack) => callback(message, createDeferredAcknowledge(ack)), messageType, priority); var brokenSubscription = subscriptionHandler.Disposable; subscriptionHandler.Disposable = subscription; try { if (attemptNumber > 0) { brokenSubscription.Dispose(); } }catch {} m_Logger.Info("Subscribed for endpoint {0}", endpoint); } catch (Exception e) { m_Logger.ErrorException(string.Format("Failed to subscribe for endpoint {0}. Attempt# {1}. Will retry in {2}ms", endpoint, attemptNumber, m_ResubscriptionTimeout), e); scheduleSubscription(doSubscribe, attemptNumber + 1); } }; doSubscribe(0); return(subscriptionHandler); }