De nuestra parte elegimos agregar tiempo de caducidad a destinos específicos mediante el uso de una ruta en camello implementada en el servicio ActiveMQ mismo.
Lo único que debe hacer es crear un archivo XML como el siguiente con el nombre, p. Ej. setJMSExpiration.xml
:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<camelContext id="camel-set-expiration" xmlns="http://camel.apache.org/schema/spring">
<!-- Copy route for each destination to expire -->
<route id="setJMSExpiration.my.queue.dlq">
<from uri="broker:queue:MY.QUEUE.DLQ"/>
<setHeader headerName="JMSExpiration">
<!-- Message will expire after 1 day -->
<spel>#{T(java.lang.System).currentTimeMillis() + 86400000}</spel>
</setHeader>
<to uri="broker:queue:MY.QUEUE.DLQ"/>
</route>
<route id="setJMSExpiration.another.queue">
<from uri="broker:queue:ANOTHER.QUEUE"/>
<setHeader headerName="JMSExpiration">
<!-- Message will expire after 5 days -->
<spel>#{T(java.lang.System).currentTimeMillis() + 432000000}</spel>
</setHeader>
<to uri="broker:queue:ANOTHER.QUEUE"/>
</route>
</camelContext>
</beans>
e importarlo en su configuración con activemq.xml
:
<!-- Add default Expiration (file in the same directory) -->
<import resource="setJMSExpiration.xml"/>
Alternativamente, también puede proporcionar una información precisa per destination policies si no desea que los mensajes caducados para llegar a la cola ActiveMQ.DLQ.
<policyEntry queue="MY.QUEUE.DLQ">
<deadLetterStrategy>
<sharedDeadLetterStrategy processExpired="false" />
</deadLetterStrategy>
</policyEntry>
<policyEntry queue="ANOTHER.QUEUE">
<deadLetterStrategy>
<sharedDeadLetterStrategy processExpired="false" />
</deadLetterStrategy>
</policyEntry>
La única limitación de esta manera es que no se puede utilizar fácilmente como comodines que se codifica aquí (se puede, pero lo necesitará algunas adaptaciones mediante el uso de cabecera destino JMS en la ruta de camello).
Tratamos de dejar que los productores definan timeToLive (y forzarlos tanto como sea posible) pero no siempre es posible forzarlos a cambiar su código, esto para minimizar el número de tales rutas.
Parece prometedor, lo intentaré –