如何在侦听器使用camel接收JMS消息之前将其延迟到队列中?

时间:2015-11-05 12:22:37

标签: jms apache-camel

我正在尝试将消息延迟到队列中几秒钟。 但是当我使用驼峰延迟选项时,它不会在队列中延迟,而是立即消耗,并在路径路径中延迟。 我们如何延迟消息以便它们在队列中存在几秒钟?

我的骆驼配置弹簧如下图所示。

                      

<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"/>

2 个答案:

答案 0 :(得分:0)

Camel内置支持Throttler模式,有一个节流器组件。请参阅:http://camel.apache.org/throttler.html

只需在路线中添加以下内容即可延迟消息。

<throttle timePeriodMillis="30000">

答案 1 :(得分:0)

通过骆驼延迟

骆驼 delay throttle 将从ActiveMQ队列中删除(使用)消息,并将其(在内存中)保留在路由中,直到进行处理。事务处理的JMS可能会减轻有关丢失消息的问题,但尚未尝试过。 Food for thought


通过ActiveMQ延迟

我使用AMQ_SCHEDULED_DELAY标头结合启用schedulerSupport [123在Camel和ActiveMQ的Spring Boot 2中使用它,456]。这是每个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;
}

可以在herehere中找到更多示例。