2011-05-19 11 views
7

Estoy trabajando en un sistema en ActiveMQ donde realmente preferiría no perder mensajes. Mi problema es que reintentar mensajes está causando que mis consumidores bloqueen (en lugar de trabajar en mensajes que podrían manejar). Me gustaría devolver los mensajes fallidos varios días para volver a intentarlo (por ejemplo, uno de mis posibles destinos es otro servidor al que accederé a través de SFTP, que podría estar fuera de servicio), pero no quiero que un consumidor bloquee durante varios días: - Quiero que siga trabajando en los otros mensajes.Volviendo a intentar mensajes en algún punto en el futuro (ActiveMQ)

¿Hay alguna manera de decirle al agente que vuelva a enviar el mensaje más tarde? En este momento estoy buscando sacar el mensaje de la cola y ponerlo con retraso, pero me pregunto si hay una manera más simple. Estoy usando Apache Camel, por lo que una solución que use eso sería buena también.

Respuesta

5

Camel sin duda puede ayudar con esto ...

Una forma es utilizar una cola separada y vuelva a intentar periódicamente mensajes por separado del flujo principal (especialmente cuando el rendimiento es una preocupación). Además, esto proporciona una cola separada para que pueda clasificar aquellos mensajes de error (ver, claro, alterar, de forma manual reintento, etc) ...

algo como esto ... ver polling consumer para más detalles

//main route to process message from a queue (needs to be fast) 
from("activemq:queue:mainQ").process(...); 

//handle any errors by simply moving them to an error queue (for retry later) 
onException(Exception.class) 
    .handled(true).to("activemq:queue:mainErrorQ"); 

//retry the error queue 
from("timer://retryTimer?fixedRate=true&period=60000") 
    .bean(myBean, "retryErrors"); 

... 

public void retryErrors() { 
    // loop to empty queue 
    while (true) { 
     // receive the message from the queue, wait at most 3 sec 
     Exchange msg = consumer.receive("activemq:queue.mainErrorQ", 3000); 
     if (msg == null) { 
      // no more messages in queue 
      break; 
     } 

     // send it to the starting queue 
     producer.send("activemq:queue.mainQ", msg); 
    } 
} 

Si cae en una solución mejor, que me haga saber ... buena suerte

+0

'" Si cae en una solución mejor, que me haga saber .. . buena suerte. Me pregunto si es que tienes ab ¿Qué solución para este problema ahora? – AlanFoster

+0

por el momento, no tengo una mejor solución. Empecé a agregar algo de soporte para hacer esto usando pollEnrich() EIP, pero ha sido presentado por ahora ... ver: https://issues.apache.org/jira/browse/CAMEL-3211 –

+0

Ah bien, lo haré mantén tu solución actual por ahora, ¡gracias! – AlanFoster

Cuestiones relacionadas