2011-03-16 13 views
9

¿Cómo configuro redeliveryPolicy en ActiveMQ en una cola?¿Cómo establecer la ActiveMQ redeliveryPolicy en una cola?

1) En el documento, consulte: activeMQ Redelivery, explique que debe configurarlo en ConnectionFactory o Connection. Pero quiero usar diferentes valores para diferentes Queue's.

2) Aparte de eso, parece que no lo hago funcionar. Si se establece en la fábrica de conexiones en la primavera (. Estoy usando activemq 5.4.2 con Spring 3.0) como esto no parece tener ningún efecto:

<amq:connectionFactory id="amqConnectionFactory" brokerURL="${jms.factory.url}" > 
    <amq:properties> 
     <amq:redeliveryPolicy maximumRedeliveries="6" initialRedeliveryDelay="15000" useExponentialBackOff="true" backOffMultiplier="5"/> 
    </amq:properties> 
</amq:connectionFactory> 

También probé para establecerlo como el definido en la propiedad cola, pero que también parecen ser ignorado como se produce la entrega de éstos, antes de que los valores definidos:

<amq:queue id="jmsQueueDeclarationSnd" physicalName="${jms.queue.declaration.snd}" > 
    <amq:properties> 
     <amq:redeliveryPolicy maximumRedeliveries="6" initialRedeliveryDelay="15000" useExponentialBackOff="true" backOffMultiplier="5"/> 
    </amq:properties> 
</amq:queue> 

, gracias

+0

¿Se puede publicar la configuración de trabajo? –

Respuesta

5

lo tengo trabajo mediante el establecimiento de la fábrica como se ha hecho anteriormente, pero sólo cuando la creación de la conexión fábrica como un grano de primavera y no a través de XBean como se muestra arriba. Esto se debe a que xsd no le permite establecer el redeliveryPolicy como un objeto, sino simplemente como una cadena. Después de establecer el nivel de caché en Consumer en DefaultMessageListenerContainer de Spring, todo funcionó.

En la cola, parece que usted puede establecer una política de entrega ... Extraño, ya que me gustaría tener diferentes configuraciones para diferentes colas/temas. Imagínese que usted tiene una cola lenta y más rápido, o un sistema externo que se conecta a que necesita más tiempo para recuperarse .. Tal vez esta función aún no se ha implementado

+2

Dado que la política de reenvío no es específica de un destino, deberá definir varias conexiones con diferentes políticas de reentrega y luego utilizar diferentes conexiones para acceder a diferentes destinos. Esto es bastante fácil de hacer si controla qué conexiones utilizan los consumidores, por ejemplo, en una configuración de Spring. Si los clientes están buscando su propia conexión, por ejemplo, a través de JNDI, tendrá que ser más meticuloso sobre cómo nombrar las diferentes conexiones y qué conexiones recomienda a los clientes que utilicen. – bsnyder

+2

[A partir de ActiveMQ v5.7.0] (http://activemq.apache.org/redelivery-policy.html) ahora puede configurar una RedeliveryPolicy por destino. – opyate

3

puede establecer el redeliveryPolicy dentro del espacio de nombres amq como esto :

<amq:connectionFactory id="jmsRedeliverConnectionFactory" brokerURL="vm://localhost"> 
    <amq:redeliveryPolicy> 
    <amq:redeliveryPolicy maximumRedeliveries="5" initialRedeliveryDelay="1000" useExponentialBackOff="true" backOffMultiplier="5" /> 
    </amq:redeliveryPolicy> 
</amq:connectionFactory> 
8

yo también estaba usando el método mostrado por Ivan arriba para amq: ConnectionFactory

Mientras que la actualización a ActiveMQ 5.7.0 me di cuenta de esto ya no funciona (desde la implementación de https://issues.apache.org/jira/browse/AMQ-3224). De todos modos después de leer un puesto mejor en los foros ActiveMQ Actualmente uso: -

<amq:queue id="emailQueue" physicalName="emailQueue" /> 
<amq:queue id="smsQueue" physicalName="smsQueue" /> 

<!-- Wait 15 seconds first re-delivery, then 45, 135, 405, 1215, 3645 seconds --> 
<bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy"> 
    <property name="backOffMultiplier" value="3" /> 
    <property name="initialRedeliveryDelay" value="15000" /> 
    <property name="maximumRedeliveries" value="6" /> 
    <property name="queue" value="*" /> 
    <property name="redeliveryDelay" value="15000" /> 
    <property name="useExponentialBackOff" value="true" /> 
</bean> 

<amq:connectionFactory id="jmsFactory" brokerURL="yourProtocol/BrokerURL"> 
    <property name="redeliveryPolicy" ref="redeliveryPolicy" /> 
</amq:connectionFactory> 

Tenga en cuenta que si hay algún mensaje que no logran ser entregado de nuevo después de 6 reintentos, ActiveMQ creará un DLQ.emailQueue' o DLQ.smsQueue y enqueue el mensaje en esa cola (quitándolo de la cola original).

+0

¿Significa esto que DLQ.emailQueue es el lugar donde se colocará el mensaje cuando se hayan alcanzado los reintentos máximos? No puedo encontrar ninguna documentación sobre qué es exactamente el destino. – styler1972

+0

seguro, hay una nueva cola 'DLQ.emailQueue' creada la primera vez que se alcanzan reintentos máximos y el mensaje pasa de 'emailQueue' a ese. Los veo con destination = 'queue: //DLQ.emailQueue', redelivered = 'false' en este caso, ya que falló. –

1

No pude obtener ActiveMQ (5.7.0) para reconocer mi política de entregas cuando la definí usando <amq:properties> en ConnectionFactory o la cola (se mantuvo usando la política de reentrega predeterminada).Lo que funcionó para mí es la siguiente:

  • Crear la RedeliveryPolicy como un bean independiente, a continuación, Primavera-referencia a él en el ConnectionFactory
  • Crear DLQ explícita y Primavera-referencia en el RedeliveryPolicy

Configuración de resorte de la siguiente manera:

<amq:connectionFactory id="jmsFactory" brokerURL="vm://localhost" redeliveryPolicy="#activeMQRedeliveryPolicy" /> 

<amq:redeliveryPolicy id="activeMQRedeliveryPolicy" destination="#myDLQ" useExponentialBackOff="true" backOffMultiplier="3" maximumRedeliveries="4" /> 

<amq:queue id="myDLQ" physicalName="DLQ.myDLQ" /> 
+0

La reentrega funciona para mí, pero el DLQ no lo hace, sigue publicando en activemq.DLQ – deFreitas

Cuestiones relacionadas