public IDisposable Subscribe( Endpoint endpoint, Action <BinaryMessage, AcknowledgeDelegate> callback, string messageType, string processingGroup, int priority) { if (string.IsNullOrEmpty(processingGroup)) { throw new ArgumentNullException(nameof(processingGroup), "should be not empty string"); } if (m_IsDisposing) { throw new ObjectDisposedException(GetType().Name); } var subscriptionHandler = new MultipleAssignmentDisposable(); Action <int> doSubscribe = null; doSubscribe = attemptNumber => { string processingGroupName = null; if (subscriptionHandler.IsDisposed) { return; } try { var group = GetProcessingGroup(processingGroup); processingGroupName = group.Name; _log.WriteInfo( nameof(ProcessingGroupManager), nameof(Subscribe), attemptNumber > 0 ? $"Resubscribing for endpoint {endpoint} within processing group '{processingGroupName}'. Attempt# {attemptNumber}" : $"Subscribing for endpoint {endpoint} within processing group '{processingGroupName}'"); var sessionName = GetSessionName(group, priority); var session = m_TransportManager.GetMessagingSession(endpoint, sessionName, Helper.CallOnlyOnce(() => { _log.WriteInfo( nameof(ProcessingGroupManager), nameof(Subscribe), $"Subscription for endpoint {endpoint} within processing group '{processingGroupName}' failure detected. Attempting subscribe again."); doSubscribe(0); })); var subscription = group.Subscribe( session, 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 { } _log.WriteInfo( nameof(ProcessingGroupManager), nameof(Subscribe), $"Subscribed for endpoint {endpoint} in processingGroup '{processingGroupName}' using session {sessionName}"); } catch (InvalidSubscriptionException e) { _log.WriteErrorAsync( nameof(ProcessingGroupManager), nameof(Subscribe), $"Failed to subscribe for endpoint {endpoint} within processing group '{processingGroupName}'", e); throw; } catch (Exception e) { _log.WriteErrorAsync( nameof(ProcessingGroupManager), nameof(Subscribe), $"Failed to subscribe for endpoint {endpoint} within processing group '{processingGroupName}'. Attempt# {attemptNumber}. Will retry in {ResubscriptionTimeout}ms", e); ScheduleSubscription(doSubscribe, attemptNumber + 1); } }; doSubscribe(0); return(subscriptionHandler); }