从Spring XD源轮询JMS队列以进行限制

时间:2015-02-19 22:15:23

标签: spring-integration spring-jms throttling spring-xd

我正在尝试使用XD JMS源从activeMq队列中读取数据并只记录它。 我的要求是仅以特定间隔读取队列,尝试实施限制。我需要我的流每秒只处理1条消息,队列可能有任何速率的消息,即20条消息/秒等。

开箱即用的JMS源实现message-driven-channel-adapter,它立即从队列中读取数据。 所以我创建了一个自定义模块(polledJms),其中包含以下内容:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:int="http://www.springframework.org/schema/integration"
    xmlns:int-jms="http://www.springframework.org/schema/integration/jms"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd
            http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <import resource="../../../common/jms-${provider}-infrastructure-context.xml"/>
    <int:channel id="output"/>
    <int-jms:inbound-channel-adapter id="jmsPolledSource"
            channel="output"
            destination-name="${destination}"
            connection-factory="connectionFactory">
    <int:poller fixed-rate="5000"/>
    </int-jms:inbound-channel-adapter>

现在,当我在队列上发布某些内容时,它不能立即获取但是在延迟之后。然而,这种延迟并不一致。我希望延迟总是5秒,但有时是10秒,1分钟等。不知道我在这里做错了什么。

我的流定义如下:

"polledJms --destination=readQ | log"

我甚至尝试在xml中使用cron表达式而不是固定速率来在轮询器中每隔10秒读取一次并仍然看到相同的行为。

我的自定义模块是否是在JMS队列上实现限制的正确方法,或者XD提供了一个可以忽略的开箱即用功能。请帮忙。

1 个答案:

答案 0 :(得分:1)

<poller>max-messages-per-poll选项,默认为Integer.MIN_VALUE,表示“在消息来源之前读取消息”。

从另一边fixed-rate表示“在prevoius开始之后的那个时间之后开始新的轮询任务”。

要使其“可延迟”,您应该考虑使用fixed-delay。在这种情况下,新轮询任务将仅在上一个任务完成后的那段时间内启动。

否则您的自定义模块看起来不错。

从另一方面,您甚至可以在jms前面使用<delayer>配置现有的outputChannel来源。

<强>更新

fixed-delay表示:start new polling task over the period after the finish of the previous one。由于您的轮询器会读取一条消息并将其发送到同一Thread内的频道,因此您应该为polling task duration添加消息处理时间。因为轮询线程很忙。所以,是的:您的消息可能不会每秒都被轮询。

从另一方面(使用fixed-rate),您应该记住,默认情况下,Spring Integration使用TaskScheduler10池大小。您可以使用META-INF/spring.integration.properties属性spring.integraton.taskScheduler.poolSize更改它。如果队列中有100条消息,10并发线程fixed-rate只能轮询一条消息,则可以到达thread pool starvation并最终得到意外的轮询时间结果。