首页 > 解决方案 > Spring Batch 处理问题出现在 RowMapper?

问题描述

Spring Batch代码中,我正在读取Oracle DB数据并将其加载到Postgres DB. 该表PATIENT_VISIT具有VisitId并且varchar仅存Integer储值。在加载数据时,Postgres我想将数据类型更改为Integer. 在 Stage env 上,没有millions记录,只找到了一个包含字母数字值的垃圾记录,比如A12345for VisitId,并且在阅读时我想跳过它,我已经在下面的代码中实现了它。

代码在 PatientVisitRowMapper 的第 3 行中断,其中 aphaNumric 值无法设置为 Integer 并生成错误Fail to convert to internal representation。如何处理?

public class PatientVisitRowMapper implements RowMapper<PatientVisit> {

    @Override
    public PatientVisit mapRow(ResultSet rs, int rowNum) throws SQLException {
        PatientVisit patientVisit = new PatientVisit();
        patientVisit.setId(rs.getString("id"));
        patientVisit.setName(rs.getString("name"));
        patientVisit.setVisitId(rs.getInt("patientVisitId"));   //Line-3, unable to map alphaNumeric into String and hence exception        
        ........
        .........
        ........
        return patientVisit;
    }
}

代码

@Bean("readPatientVisitJob")
@Primary
public Job readPatientVisitJob() {
    return jobBuilderFactory.get("readPatientVisitJob")
            .incrementer(new RunIdIncrementer())
            .start(PatientVisitStepOne())
            .listener(PatientVisitJobListener())
            .build();
}

@Bean
public Step PatientVisitStepOne() {
    return stepBuilderFactory.get("PatientVisitStepOne")
            .<PatientVisit, PatientVisit>chunk(5000)
            .reader(PatientVisitReader())
            .processor(PatientVisitProcessor())
            .writer(PatientVisitWriter())
            .faultTolerant()
            .skip(NullPointerException.class)
            .skipLimit(10)
            .build();
}

标签: springspring-batch

解决方案


您要么在行映射器实现中处理这些错误,要么让它们冒泡,它们将被读者抛出。

如果您决定让它们冒泡,则可以将异常类型声明为可跳过,并且可以使用org.springframework.batch.core.SkipListener#onSkipInRead(Throwable t).


推荐阅读