2011-03-16 15 views
9

Come si imposta redeliveryPolicy in ActiveMQ su una coda?Come impostare ActiveMQ redeliveryPolicy su una coda?

1) Nel documento, vedere: activeMQ Redelivery, spiegare che è necessario impostarlo su ConnectionFactory o Connessione. Ma voglio usare valori diversi per le diverse code.

2) A parte questo, non sembra che funzioni. Impostazione sulla produzione connessioni in primavera (. Sto usando ActiveMQ 5.4.2 con la molla 3.0) come questo non sembrano avere alcun effetto:

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

Ho anche cercato di impostarlo come proprietà sulla definito coda, ma che sembrano anche essere ignorato come la riconsegna avviene prima che i valori definiti:

<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> 

Grazie

+0

Puoi postare la configurazione di lavoro? –

risposta

5

ho capito di lavoro impostandolo sulla fabbrica come fatto in precedenza, ma solo durante la creazione del collegamento fabbrica come bean Spring e non tramite XBean come mostrato sopra. Questo perché xsd non ti permette di impostare redeliveryPolicy come un oggetto, ma semplicemente come una stringa. Dopo aver impostato il livello di cache su Consumer in DefaultMessageListenerContainer di Spring, tutto ha funzionato.

Sulla coda, sembra che sia semplice impostare una politica di consegna ... Strano, perché mi piacerebbe avere impostazioni diverse per le varie code/argomenti. Provate a immaginare di avere un lento e più veloce della coda, o un sistema esterno che si connette a che ha bisogno di più tempo per recuperare .. Forse questa funzione è ancora da attuare

+2

Poiché la politica di riconsegna non è specifica per una destinazione, sarà necessario definire più connessioni con diverse politiche di riconsegna e quindi utilizzare connessioni diverse per accedere a destinazioni diverse. Questo è abbastanza facile da fare se si controlla quali connessioni vengono utilizzate da quali utenti, ad es., In una configurazione di Spring. Se i clienti stanno cercando la propria connessione, ad esempio tramite JNDI, sarà necessario essere più meticolosi su come si nominano connessioni diverse e quali connessioni si consiglia di utilizzare. – bsnyder

+2

[A partire da ActiveMQ v5.7.0] (http://activemq.apache.org/redelivery-policy.html) ora è possibile configurare RedeliveryPolicy in base alla destinazione. – opyate

3

È possibile impostare il redeliveryPolicy all'interno del namespace amq come questo :

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

anche io stato con il metodo illustrato da Ivan sopra per amq: ConnectionFactory

Mentre aggiornamento a ActiveMQ 5.7.0 ho notato che questo non funziona più (in quanto l'attuazione di 0.123.886,782 mila). In ogni caso dopo aver letto un post meglio sui forum ActiveMQ Attualmente 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> 

Si noti che per eventuali messaggi che non riescono ad essere riconsegnato dopo 6 tentativi, ActiveMQ creerà un DLQ.emailQueue' o DLQ.smsQueue e Enqueue il messaggio su quella coda (rimuovendolo dalla coda originale).

+0

Ciò significa che DLQ.emailQueue è il punto in cui verrà inserito il messaggio quando è stato raggiunto il numero massimo di tentativi? Non riesco a trovare alcuna documentazione su cosa sia esattamente la destinazione. – styler1972

+0

sicuro, c'è una nuova coda "DLQ.emailQueue" creata la prima volta che viene raggiunto il numero massimo di tentativi e il messaggio passa da "emailQueue" a quello. Li vedo con destination = 'queue: //DLQ.emailQueue', redelivered = 'false' in questo caso poiché non è riuscito. –

1

Impossibile ottenere ActiveMQ (5.7.0) per riconoscere la mia politica di riconsegna quando l'ho definita utilizzando <amq:properties> su ConnectionFactory o sulla coda (continuava a utilizzare il criterio di riconsegna predefinito).Che cosa ha funzionato per me è questo:

  • Creare il RedeliveryPolicy come un fagiolo standalone, quindi Primavera-riferimento nel ConnectionFactory
  • Creare un DLQ esplicito e Primavera-di riferimento nel RedeliveryPolicy

Spring config come segue:

<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 riconsegna funziona per me ma il DLQ non funziona, continuando a pubblicare su activemq.DLQ – deFreitas