0

我有一个可以从命令行运行的 spring 批处理应用程序。批处理作业的流程是当它开始时,它从队列中读取消息并转换然后写入数据库。现在为此,我使用 Spring Batch 中的 JmsItemReader 和内部 read() 方法,我有我的逻辑。现在的问题是,当这个过程开始时,队列中可能没有消息存在,在这种情况下,我想停止处理整个批次。

这如何在春季批次中实现?基本上,当您使用 JmsItemReader 时会发生什么,它会不断地 ping jms 代理并读取消息,然后休眠一段时间。现在,如果没有要处理的消息,那么我们为什么要保持批处理进程运行并让它消耗 CPU。我希望它按照计划在第二天再次运行。

谢谢

4

1 回答 1

1

此行为来自 spring-jms 提供的 jmstemplate 的默认配置

timeOut 的默认值是不确定的

private long receiveTimeout = RECEIVE_TIMEOUT_INDEFINITE_WAIT;

使用此值,将使用messageconsumer.receive()

接收为此消息使用者生成的下一条消息。此调用将无限期阻塞,直到生成消息或关闭此消息使用者。

所以你需要为 jmstemplate 设置一个超时值

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
     (...)
     <property name="receiveTimeout" value="someLongValueForMilliseconds" />
     (...)
</bean>

然后将使用receive(long timeOut)

此调用阻塞,直到消息到达、超时过期或此消息使用者关闭。零超时永不过期,并且调用无限期阻塞。

如果你使用 -1 的值,调用会立即发生

于 2011-07-28T21:57:42.857 回答