Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spring批处理中的可跳过异常类仅跳过一行_Spring_Spring Data Jpa_Spring Batch - Fatal编程技术网

spring批处理中的可跳过异常类仅跳过一行

spring批处理中的可跳过异常类仅跳过一行,spring,spring-data-jpa,spring-batch,Spring,Spring Data Jpa,Spring Batch,我不熟悉SpringBatch,例如csv文件 Employee Name Id age year Department DeptName deptId desc Department DeptName deptId desc Employee Name Id age year Department DeptName deptId desc Department DeptName deptId desc 这是我的格式 如果名称为的雇主存在,mysql将抛出DataIntegrityVi

我不熟悉SpringBatch,例如csv文件

Employee   Name Id age year
Department DeptName deptId desc
Department DeptName deptId desc
Employee   Name Id age year
Department DeptName deptId desc
Department DeptName deptId desc
这是我的格式

如果名称为的雇主存在,mysql将抛出DataIntegrityViolationException

所以我补充说

<batch:skippable-exception-classes>
<batch:include  class="org.springframework.dao.DataIntegrityViolationException" />
</batch:skippable-exception-classes>

因此,这将跳过整个单位相应的雇主和部门记录

即使员工存在并抛出此异常,我也必须做什么


然后继续使用部门。

我建议使用项目分类器

public class ItemTypeClassifier {
    @Classifier
    public String classify(Item item) {
        return item.getType();// returns "Employee", "Department"
    }
}
<bean id="classifier"  class="org.springframework.batch.classify.BackToBackPatternClassifier">
    <property name="routerDelegate">
        <bean class="ItemTypeClassifier" />
    </property>
    <property name="matcherMap">
        <map>
            <entry key="Employee" value-ref="emplyeeItemWriter" />
            <entry key="Department" value-ref="departmentItemWriter" />
        </map>
    </property>
</bean>
然后,使用两个不同的条目编写器实现路由器,一个用于员工,一个用于部门

<bean id="classifier"  class="org.springframework.batch.classify.BackToBackPatternClassifier">
    <property name="routerDelegate">
        <bean class="ItemTypeClassifier" />
    </property>
    <property name="matcherMap">
        <map>
            <entry key="Employee" value-ref="emplyeeItemWriter" />
            <entry key="Department" value-ref="departmentItemWriter" />
        </map>
    </property>
</bean>

然后

<bean id="ItemWriter" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter">
    <property name="classifier" ref="classifier" />
</bean>


现在您有了两个不同的编写器,您可以在作业中通过为它们定义两个单独的可跳过异常配置来运行两个步骤

对于雇主和部门,是否有不同的处理者?否,如果我创建一个单独的处理者并跳到下一步?创建一个自定义处理者,在数据库中检查雇主,如果找到则跳过(返回null)。否则,返回雇主数据并将其传递给编写者当需要处理大量记录时,检查每个员工是否存在会使流程更加繁重,对吗?如果我试图只在错误文件中写入重复的对象,那么onSkipInWrite我可能会得到Employee transient对象,得到Employee item的任何可能性我通常会尽可能避免异常处理,如果我可以使用项目处理器和缓存达到相同的目标(以避免对同一对象的多个数据库命中)。如果你想,试着捕捉写错误;在OnSkiptMeinWrite中有目标对象。