コード例 #1
0
        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);
        }