我正在尝试将消息延迟到队列中几秒钟。 但是当我使用驼峰延迟选项时,它不会在队列中延迟,而是立即消耗,并在路径路径中延迟。 我们如何延迟消息以便它们在队列中存在几秒钟?
我的骆驼配置弹簧如下图所示。
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
<route id="routeOne" delayer="10000">
<from uri="jms://queueone?concurrentConsumers=1"/>
<log message="routeOne incoming message ${body}"/>
<delay><constant>30000</constant></delay>
<process ref="loggerProcessor"/>
</route>
</camelContext>
<bean id="loggerProcessor" name="loggerProcessor" class="emh.LoggerProcessor"/>
答案 0 :(得分:0)
Camel内置支持Throttler模式,有一个节流器组件。请参阅:http://camel.apache.org/throttler.html
只需在路线中添加以下内容即可延迟消息。
<throttle timePeriodMillis="30000">
答案 1 :(得分:0)
骆驼 delay 和 throttle 将从ActiveMQ队列中删除(使用)消息,并将其(在内存中)保留在路由中,直到进行处理。事务处理的JMS可能会减轻有关丢失消息的问题,但尚未尝试过。 Food for thought。
我使用AMQ_SCHEDULED_DELAY
标头结合启用schedulerSupport
[1,2,3在Camel和ActiveMQ的Spring Boot 2中使用它,4,5,6]。这是每个JMS 2.0 Delivery Delay。
请注意,只有在没有活动使用者(即应用程序关闭或骆驼路由禁用)时,消息才会出现在ActiveMQ队列中(待处理)。以下配置用于使用现有 ActiveMQ代理。
application.properties (source)
spring.activemq.broker-url=tcp://localhost:61616
RouteBuilder
from("jms://incomingQueue").setHeader("AMQ_SCHEDULED_DELAY", constant("1000")).inOnly("jms://delayedQueue");
from("jms://delayedQueue").process(...);
activemq.xml (现有代理安装)
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">
对于/usr/local/Cellar/activemq/<version>/libexec/conf
下的OSX Homebrew。
如果您想在应用程序中使用嵌入 的代理,则可以使用 BrokerService 。
默认情况下,数据保留在 activemq-data 中,并且需要activemq-kahadb-store
依赖性-如果您选择了JDBC(source)。使用brokerService.setPersistent( false )
不再需要存储依赖关系,但是JMS消息再次存储在内存中 。
@Bean
public BrokerService brokerService()
{
BrokerService brokerService = new BrokerService();
brokerService.setSchedulerSupport( true );
return brokerService;
}