Spring批处理2.1和JmsReader

时间:2011-07-24 17:07:09

标签: spring-batch

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

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

由于

1 个答案:

答案 0 :(得分: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,则立即调用