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.

Plantilla de lectura de tiempo para JMS en IBM MQ.

Tengo la necesidad de implementar una lectura cronometrada de un ibm mq.

Tengo una aplicación cliente que lee de una cola y en algunos casos quiero evitar la reversión de la transacción, escribiendo el mensaje en una nueva cola en lugar de la cola de carta muerta. Entonces, quiero reprocesar el mensaje después de 5 minutos y repetir el proceso en caso de error.

Ahora leo con un Jms Listener

@JmsListener(destination = "${QueueName}")
public void readMessages(TextMessage msg) { ...

Pero si el mensaje no se consume, me gustaría volver a escribirlo en la cola y esperar 5 minutos antes de leerlo de nuevo. ¿Cuál es la mejor manera de implementar una lectura cronometrada en este caso?

¡Gracias a todos de antemano!

ACTUALIZACIÓN

Con IBM MQ versión 8+ existe la función de retraso de entrega que resuelve mi problema. ¡Saludos!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Java, IBM MQ y Spring-JMS, sugiero la siguiente solución:

    Puedes usar ScheduledExecutorService para implementar una lectura programada de un IBM MQ. Primero, configura el factor de contenedor del escuchante para que use un SimpleMessageListenerContainer con una concurrencia de 1, de manera que solo se lea un mensaje por vez. Luego, en el método readMessages, si el mensaje no ha sido consumido, envíalo a una cola nueva usando JmsTemplate, con un retraso de entrega de 5 minutos. Finalmente, programa una tarea usando ScheduledExecutorService para leer mensajes de la nueva cola después de 5 minutos y repetir el proceso en caso de error.

    Aquí hay un ejemplo de implementación:

     @Autowired
     private JmsTemplate jmsTemplate;
    
     @Autowired
     private SimpleMessageListenerContainerFactory listenerContainerFactory;
    
     @Autowired
     private ScheduledExecutorService scheduledExecutorService;
    
     @JmsListener(destination = "${QueueName}", containerFactory = "listenerContainerFactory")
     public void readMessages(TextMessage msg) {
         try {
             // procesa el mensaje
         } catch (Exception e) {
             // envía el mensaje a una nueva cola con un retraso de entrega de 5 minutos
             jmsTemplate.send("NewQueueName", session -> {
                 TextMessage message = session.createTextMessage(msg.getText());
                 message.setLongProperty(WMQConstants.JMS_IBM_MQMD_DELIVERY_DELAY, 300000);
                 return message;
             });
    
             // programa una tarea para leer mensajes de la nueva cola después de 5 minutos
             scheduledExecutorService.schedule(() -> {
                 jmsTemplate.setReceiveTimeout(5000);
                 TextMessage newMsg = (TextMessage) jmsTemplate.receive("NewQueueName");
                 if (newMsg != null) {
                     readMessages(newMsg);
                 }
             }, 5, TimeUnit.MINUTES);
         }
     }
    

    ¡Espero que esto ayude! Avísame si tienes alguna otra pregunta.

Comments are closed.