Служба не получает сообщения после перезапуска службы очереди сообщений

У нас есть служба, которая получает сообщения из n очередей сообщений. Однако при перезапуске службы очереди сообщений служба извлечения сообщений перестает получать сообщения даже после успешного перезапуска службы очереди сообщений.

Я попытался специально перехватить исключение MessageQueueException, выдаваемое службой извлечения сообщений, и снова вызвать метод очереди BeginReceive. Однако за 2 секунды или около того, которые требуются для перезапуска службы очереди сообщений, я получаю около 1875 экземпляров исключения, а затем служба перестает работать, когда в нашем методе StartListening генерируется другое исключение MessageQueueException.

Существует ли элегантный способ восстановления после перезапуска службы очереди сообщений?

    private void OnReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
    {
        MessageQueue queue = (MessageQueue)sender;

        try
        {
            Message message = queue.EndReceive(e.AsyncResult);

            this.StartListening(queue);

            if (this.MessageReceived != null)
                this.MessageReceived(this, new MessageReceivedEventArgs(message));
        }
        catch (MessageQueueException)
        {
            LogUtility.LogError(String.Format(CultureInfo.InvariantCulture, StringResource.LogMessage_QueueManager_MessageQueueException, queue.MachineName, queue.QueueName, queue.Path));
            this.StartListening(queue);
        }            
    }

    public void StartListening(MessageQueue queue)
    {
        queue.BeginReceive();
    }

Мне нужно разобраться с проблемой бесконечного цикла, которая возникает из-за этого, и немного почистить ее, но вы поняли идею.

При возникновении исключения MessageQueueException вызовите метод RecoverQueue.

    private void RecoverQueue(MessageQueue queue)
    {            
        string queuePath      = queue.Path;
        bool   queueRecovered = false;

        while (!queueRecovered)
        {
            try
            {
                this.StopListening(queue);
                queue.Close();
                queue.Dispose();

                Thread.Sleep(2000);

                MessageQueue newQueue = this.CreateQueue(queuePath);

                newQueue.ReceiveCompleted += new ReceiveCompletedEventHandler(this.OnReceiveCompleted);

                this.StartListening(newQueue);

                LogUtility.LogInformation(String.Format(CultureInfo.InvariantCulture, "Message queue {0} recovered successfully.", newQueue.QueueName));

                queueRecovered = true;
            }
            catch (Exception ex)
            {
                LogUtility.LogError(String.Format(CultureInfo.InvariantCulture, "The following error occurred while trying to recover queue: {0} error: {1}", queue.QueueName, ex.Message));                
            }
        }           
    }

    public void StopListening(MessageQueue queue)
    {
        queue.ReceiveCompleted -= new ReceiveCompletedEventHandler(this.OnReceiveCompleted);            
    }
9
задан chad 26 April 2012 в 18:47
поделиться