С нашей стороны мы решили добавить время истечения срока действия в определенные пункты назначения, используя маршрут верблюда, развернутый в самой службе ActiveMQ.
Единственное, что нужно сделать, это создать XML-файл, например, с именем, например. 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>
и импортировать его в activemq.xml
конфигурации с:
<!-- Add default Expiration (file in the same directory) -->
<import resource="setJMSExpiration.xml"/>
В качестве альтернативы вы можете также предоставить конкретную per destination policies, если вы не хотите, чтобы сообщения с истекшим сроком годности, чтобы достигнуть очереди ActiveMQ.DLQ.
<policyEntry queue="MY.QUEUE.DLQ">
<deadLetterStrategy>
<sharedDeadLetterStrategy processExpired="false" />
</deadLetterStrategy>
</policyEntry>
<policyEntry queue="ANOTHER.QUEUE">
<deadLetterStrategy>
<sharedDeadLetterStrategy processExpired="false" />
</deadLetterStrategy>
</policyEntry>
Единственным ограничением этого способа является то, что вы не можете легко использовать подстановочные знаки, как это закодировано (можно, но это будет необходимо несколько приспособлений, используя заголовок назначения JMS в маршруте верблюд).
Мы стараемся, чтобы производители определяли timeToLive (и максимально усилили их), но не всегда можно заставить их изменить свой код, чтобы минимизировать количество таких маршрутов.
Выглядит многообещающе, я дам ему выстрел –