У нас есть служба, которая получает сообщения из 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);
}