es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo mover mensajes uno por uno de DLQ a Deferido utilizando c#

Quiero mover el mensaje de DLQ a Deffered bajo una condición particular, como si una propiedad personalizada “RetryCount” es mayor que 5, de lo contrario debo moverlo a la cola principal. La transferencia de mensajes de DLQ a la cola principal funciona bien. Pero no encuentro una solución adecuada para mover mensajes después de leer de DLQ a la cola diferida. Estoy utilizando el código en C#.
Nota: Estoy utilizando el modelo de tema y suscripción.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para mover un mensaje de la cola de “Dead-Letter” (DLQ) a la cola de diferidos (Deferred Queue) según una condición dada, debes seguir los siguientes pasos:

    1. Crea una suscripción con una regla que evalúe el valor de la propiedad personalizada “RetryCount”. La regla debe filtrar los mensajes donde “RetryCount” sea mayor a 5.
    var subscriptionDescription = new SubscriptionDescription(topicPath, subscriptionName);
    subscriptionDescription.Filter = new SqlFilter("RetryCount > 5");
    namespaceManager.CreateSubscription(subscriptionDescription);
    
    1. Para mover los mensajes de la DLQ a la suscripción, puedes utilizar el método ReceiveDeadLetterAsync. Este método recupera el mensaje y devuelve un nuevo BrokeredMessage.
    var deadLetterReceiver = factory.CreateMessageReceiver(topicPath + "/$DeadLetterQueue", ReceiveMode.PeekLock);
    var message = await deadLetterReceiver.ReceiveAsync();
    
    1. Evalúa la condición en el mensaje recibido. Si “RetryCount” es mayor a 5, reenvía el mensaje a la cola de diferidos con una propiedad de programación adecuada.

      Si la condición no se cumple, envía el mensaje a la cola principal.

    if ((int)message.Properties["RetryCount"] > 5)
    {
        var deferredReceiver = factory.CreateMessageReceiver(topicPath + "/Subscriptions/" + subscriptionName, ReceiveMode.PeekLock);
        message.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddMinutes(5);
        await deferredReceiver.SendAsync(message);
    }
    else
    {
        var mainSender = factory.CreateMessageSender(topicPath);
        await mainSender.SendAsync(message);
    }
    
    1. Elimina el mensaje de la DLQ utilizando el método CompleteAsync.
    await message.CompleteAsync();
    

    Nota: Asegúrate de tener los permisos adecuados y las cadenas de conexión y los espacios de nombres necesarios definidos en tu código.

Comments are closed.