spring - Spring Batch 处理问题出现在 RowMapper?
问题描述
在Spring Batch
代码中,我正在读取Oracle DB
数据并将其加载到Postgres DB
. 该表PATIENT_VISIT
具有VisitId
并且varchar
仅存Integer
储值。在加载数据时,Postgres
我想将数据类型更改为Integer
. 在 Stage env 上,没有millions
记录,只找到了一个包含字母数字值的垃圾记录,比如A12345
for 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();
}
解决方案
您要么在行映射器实现中处理这些错误,要么让它们冒泡,它们将被读者抛出。
如果您决定让它们冒泡,则可以将异常类型声明为可跳过,并且可以使用org.springframework.batch.core.SkipListener#onSkipInRead(Throwable t)
.
推荐阅读
- blazor - Blazor WebAssembly App 可以用于生产吗?
- angular - Jasmin:如何在 Angular 8 中模拟 @ViewChild 组件
- javascript - Leaflet Cluster 更改了我所有的海关标记图标
- cypress - 如何使用 cypress 测试两个元素是否具有相同的宽度
- apache-spark - Spark Streaming 和 Kafka 分区问题
- javascript - 为什么这个 forEach 不能在这个 else if 语句中工作?
- r - 如何修复饼图rstudio中的图例
- json - 快速解析响应时出现问题?
- angular - 如何在剑道网格的角度 8 下拉列表中绑定嵌套数组?
- rcpp - 第一次尝试在 Rcpp 中使用 R 函数时出错