3

我需要在指定的时间间隔内将消息从 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,忽略 <int:poller> 配置。我已经尝试了基于间隔和基于 cron 的解决方案,它们似乎工作相似(立即将消息从 Queue1 传递到 Queue2)。这里的“poller”配置有什么问题吗?任何帮助都感激不尽。

4

1 回答 1

2

您需要在适配器上设置接收超时。否则它将阻塞接收()并立即获取消息。

编辑:请参阅下面的评论 - 从 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 开始)是不阻塞,这意味着消息将仅在轮询器的计划中接收。

于 2012-03-01T20:57:46.217 回答