我正在尝试使用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提供了一个可以忽略的开箱即用功能。请帮忙。
答案 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使用TaskScheduler
和10
池大小。您可以使用META-INF/spring.integration.properties
属性spring.integraton.taskScheduler.poolSize
更改它。如果队列中有100
条消息,10
并发线程fixed-rate
只能轮询一条消息,则可以到达thread pool starvation
并最终得到意外的轮询时间结果。