我有一个弹簧批处理应用程序,可以从命令行运行。批处理作业的流程是在它启动时,它从队列中读取消息然后转换然后写入db。现在为此我使用Spring批处理中的JmsItemReader和read()方法内部我有我的逻辑。现在的问题是,当这个过程开始时,队列中不存在任何消息,在这种情况下我想停止处理整个批处理。
如何在春季批次中实现这一目标?基本上当你使用JmsItemReader时会发生什么,它会持续ping jms代理并读取消息然后再睡一段时间。现在,如果没有要处理的消息,那么我们为什么要保持批处理进程运行并让它消耗CPU。我想让它按照计划在第二天再次运行。
由于
答案 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>
此来电会阻止消息到达直到,超时过期,或者这个 消息消费者已关闭。超时零永不过期,而且 无限期地调用块。
如果您使用值-1,则立即调用