我想跳过一些关于流程的记录。
我试过的是,我创建了自定义异常,当我想跳过记录并调用Skip监听器onSkipInProcess方法时抛出异常。它工作正常。
请找到配置。
<batch:chunk reader="masterFileItemReader" writer="masterFileWriter" processor="itemProcessor" commit-interval="5000" skip-limit="100000" >
<batch:skippable-exception-classes>
<batch:include class="org.springframework.batch.item.file.FlatFileParseException"/>
<batch:include class="com.exception.SkipException"/>
</batch:skippable-exception-classes>
<batch:listeners>
<batch:listener ref="recordSkipListener"/>
</batch:listeners>
但我想知道有没有其他方法可以跳过进程中的记录?
此致 香卡
答案 0 :(得分:8)
确实有两种方法可以做到这一点,一种是你提到跳过机制,另一种是返回null
,它会过滤掉项目而不是写出来。这里是documentation link - 6.3.2. Filtering records,很好地解释了两种方法之间的区别。此blog post解释了批量跳过细节和交易。
当您解析csv文件并且您希望每行有5个项目但是一行包含6个无效项目时,您可以选择跳过它(通过将读者异常标记为可跳过并在策略中定义条件,如您给出的那样例)。但是,如果每一行都包含名称,并且您的用例是不编写以字母N
开头的项目,这些项目更好地通过返回null
(过滤项目)实现,因为它是有效项目但不是根据您的业务情况下。
另请注意,如果您返回null
这些项目的数量将位于StepContext
中的getFilterCount()
,如果您使用跳过方式,则会getReadSkipCount()
,getProcessorSkipCount
尊重{1}}和getWriteSkipCount
。
答案 1 :(得分:1)
@Component
@Scope(value = "step")
public class XyzItemProcessor implements ItemProcessor<ABCInfo , ABCInfo > {
@Override
public ABCInfo process(ABCInfo abcInfo) throws Exception {
if (abcInfo.getRecordType().equals("H") || extVoterInfo.getRecordType().equals("T"))
return null;////this is how we skip particular record to persist in database
else {
return abcInfo;
}
}
}
返回null将跳过要保留在数据库中的特定记录
答案 2 :(得分:0)
当我们在process()方法中返回null时,它将过滤记录并增加过滤器计数。
@Transactional(propagation = Propagation.REQUIRED)
@Override
public SomeObject process(SomeObject someObject) throws Exception {
if (some condition) {
return null;
}
}
如果我们想跳过记录,则抛出异常。这将跳过记录并增加processSkipCount。
@Transactional(propagation = Propagation.REQUIRED)
@Override
public SomeObject process(SomeObject someObject) throws Exception {
if (some condition) {
throw new Exception("invalid record");
}
}
将此异常添加到上下文文件中。
<batch:skippable-exception-classes>
<batch:include class="java.lang.Exception" />
</batch:skippable-exception-classes>
答案 3 :(得分:0)
还有另一种不写(跳过)东西的方法。例如,我们说我们有这个步骤:
<batch:step id="createCsvStep">
<batch:tasklet>
<batch:chunk reader="jdbcCursorItemReader" processor="processor" writer="compositeWriter"
commit-interval="#{jobParameters['commit.interval']}" />
</batch:tasklet>
</batch:step>
<bean id="compositeWriter" class="org.springframework.batch.item.support.CompositeItemWriter" scope="step">
<property name="delegates">
<list>
<ref bean="csvFileItemWriter1"/>
<ref bean="csvFileItemWriter2"/>
</list>
</property>
</bean>
让我们假设第一个作家将写下所有的值,但同时,第二个作者将跳过其中的一些。为了实现这一点,我们可以扩展我们的编写器(例如FlatFileItemWriter),并覆盖它的写方法,如下所示:
@Override
public void write(List<? extends T> items) throws Exception {
// ...
if (itemsPassesCheckingCondition) {
super.write(items);
}
}