我需要在指定的时间间隔内将消息从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”配置有什么问题吗?任何帮助将不胜感激。
答案 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开始)是不阻止的,这意味着只有在轮询器的时间表上才会收到消息。