Tenemos un servicio que recibe mensajes de n colas de mensajes. Sin embargo, si se reinicia el servicio Message Queue Server, el servicio de recuperación de mensajes deja de recibir mensajes incluso después de que el servicio Message Queue Server se haya reiniciado correctamente.El servicio no recibe mensajes después de que se reinició el servicio Message Queue Server
He intentado atrapar específicamente la MessageQueueException que se lanza en el servicio de recuperación de mensajes e invoco nuevamente el método BeginReceive de la cola. Sin embargo, en los 2 segundos aproximadamente que tarda el servicio de Message Queue Server en reiniciarse, obtengo alrededor de 1875 instancias de la excepción y luego el servicio deja de funcionar cuando se lanza otra MessageQueueException en nuestro método StartListening.
¿Hay alguna manera elegante de recuperar desde el reinicio del servicio Message Queue Server?
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();
}
Necesito ocuparme de la cuestión del lazo infinito que esto causa y limpiarlo un poco, pero se entiende la idea.
Cuando se produce la excepción MessageQueueException, invoque el método 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);
}
Publicado el código del método RecoverQueue – chad