С нашей стороны мы решили добавить срок действия к определенным пунктам назначения, используя верблюжий маршрут, развернутый в самой службе 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"/>
В качестве альтернативы вы также можете указать конкретные для политики назначения , если вы нене нужно, чтобы просроченные сообщения доходили до очереди 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 (и принудительно их максимально использовать), но не всегда возможно заставить их изменить ихкод, чтобы минимизировать количество таких маршрутов.