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);
        }