在Spring JMS集成中配置基于区间的cron

时间:2012-02-02 00:13:03

标签: spring jms integration spring-integration poller

我需要在指定的时间间隔内将消息从Queue1转发到Queue2,而不是在消息到达Queue1之后。以下是我的配置。

<int-jms:inbound-channel-adapter  id="inboundChannelAdapterId" connection-factory="connFactory" destination="jmsQueue1" channel="queueChannel" >
    <int:poller send-timeout="2000" >
        <!--
        <int:interval-trigger initial-delay="60000" interval="60000"
        fixed-rate="true"/>
        -->
        <int:cron-trigger expression="0 0/1 * * * ?" />
    </int:poller>
</int-jms:inbound-channel-adapter>

<int-jms:outbound-channel-adapter channel="queueChannel" connection-factory="connFactory" destination="jmsQueue2" >
</int-jms:outbound-channel-adapter>

<int:channel id="queueChannel" />

上面的xml配置会立即将消息从Queue1转发到Queue2,而忽略&lt; int:poller&gt;组态。我已经尝试了基于区间和基于cron的解决方案,它们似乎工作类似(立即将消息从Queue1传递到Queue2)。这里的“poller”配置有什么问题吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您需要在适配器上接收超时。否则它会阻塞receive()并立即收到消息。

编辑:请参阅下面的评论 - 自2.0.4以来,默认情况下轮询队列的线程不再阻止。

您可能还想考虑为轮询器使用2.0+语法;您当前的语法在2.0中已弃用,在2.1 ...

中不允许
<jms:inbound-channel-adapter id="in" channel="jmsinToStdoutChannel" destination="requestQueue">
    <poller fixed-delay="30000"/>
</jms:inbound-channel-adapter>

只是为了澄清......如果在适配器上设置了接收超时,则轮询器线程将阻塞该长度或直到消息到达。这可能使轮询者看起来不遵守其时间表。默认值(自2.0.4开始)是不阻止的,这意味着只有在轮询器的时间表上才会收到消息。