【发布时间】:2017-11-07 13:39:27
【问题描述】:
我们已经配置了单步批处理作业。一般结构是这样的,
<batch:job id="mainJob">
<batch:step id="step1">
<batch:tasklet>
<batch:chunk reader="fileReader" writer="jmsItemWriter" >
<batch:retryable-exception-classes>
<batch:include class="org.springframework.dao.CannotAcquireLockException"/>
</batch:retryable-exception-classes>
</batch:chunk>
</batch:tasklet>
<batch:end on="UNKNOWN"/>
<batch:next on="*" to="step1"/>
<batch:listeners>
<batch:listener ref="listener1"/>
<batch:listener ref="listener2"/>
</batch:listeners>
</batch:step>
<batch:listeners>
<batch:listener ref="jobListener"/>
</batch:listeners>
</batch:job>
fileReader 是 FlatFileItemReader,它逐行读取文件并将每一行传递给“listener2”。在 listener2 中,如果行中有错误,则应将状态设置为“未知”(未失败,因为不应再次启动作业),然后停止作业。
为了做到这一点,我们有。
<batch:end on="UNKNOWN"/>
<batch:next on="*" to="step1"/>
但是批处理作业并没有在 Unknown 上结束,而是因为“next”而进入循环。如果没有提到“下一个”,则有一个例外。
我们如何解决这个问题?
编辑:
对 Dean 的回答的更多解释。
Listener2 逐行获取 FieldSet 即文件条目。在处理这些条目时,如果满足某些条件(也涉及数据库查询),则作业不应读取进一步的文件并停止。由于处理是在不抛出任何异常的覆盖方法“mapFieldSet”中完成的,因此不能使用新异常并且返回 null 只是读取下一行。通常文件有数千行,但在前 2 行中确定是否需要进一步阅读。
【问题讨论】:
-
根据您的更新,我在下面的答案中添加了更多内容
标签: java spring-batch