Domanda

Come faccio a impostare il redeliveryPolicy in ActiveMQ in una coda?

1) Nel documento, si veda: ActiveMQ Riconsegna , il che spiega si dovrebbe impostare sul ConnectionFactory o Connessione. Ma voglio usare diverso valore di per diverso coda di.

2) A parte questo, non mi sembra per farlo funzionare. 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 provato anche per impostarla come proprietà sulla coda definita, ma che sembrano anche essere ignorato come si verifica la riconsegna 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

È stato utile?

Soluzione 2

I got it lavoro impostandolo sulla fabbrica come fatto in precedenza, ma solo durante la creazione della fabbrica di connessione come un fagiolo primavera e non attraverso XBean come indicato sopra. Questo perché il XSD non consente di impostare il redeliveryPolicy come un oggetto, ma semplicemente come una stringa. Dopo aver impostato il livello di cache dei consumatori in DefaultMessageListenerContainer di primavera, tutto ha funzionato.

In coda, sembra che si semplice possibile impostare una politica di consegna ... Strano, come mi piacerebbe avere impostazioni diverse per / argomenti diversi di coda. Provate a immaginare di avere un sistema esterno lento e coda più veloce, o un che si connette a che ha bisogno di più tempo per recuperare .. Forse questa funzione è ancora da attuare

Altri suggerimenti

Anche io stavo usando il metodo illustrato da Ivan sopra per amq: ConnectionFactory

Mentre l'aggiornamento a 5.7.0 ActiveMQ Ho notato che questo non funziona più (in quanto l'attuazione di https://issues.apache.org/jira/browse/AMQ-3224 ). 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 accodare il messaggio su quella coda (accodamento dalla coda originale).

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

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

non ho potuto ottenere ActiveMQ (5.7.0) per riconoscere la mia politica di riconsegna quando ho definito utilizzando <amq:properties> sul ConnectionFactory o la coda (ha mantenuto utilizzando il criterio di riconsegna di default). Che cosa ha funzionato per me è questo:

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

Primavera 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" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top