【发布时间】:2015-02-02 13:54:02
【问题描述】:
我的简单批处理流程从 CSV 文件读取并写入 MySQL 数据库(批处理配置正常且有效)。
我正在使用 JdbcBatchItemWriter 的自定义实现来完成这项工作,我实际上是在我的编写器构造函数中进行更新。
CsvReader.java
@Component
@StepScope
public class EducationCsvReader extends FlatFileItemReader {
public final static String CSV_FILE_NAME = "education.csv.file";
@Value("#{jobParameters['"+ CSV_FILE_NAME +"']}")
public void setResource(final String csvFileName) throws Exception {
setResource(
new FileSystemResource(csvFileName)
);
}
public EducationCsvReader() {
setLinesToSkip(1);
setEncoding("UTF-8");
setStrict(true);
setLineMapper((line, num) -> {
String[] values = line.split(";");
return new Education()
.setName(values[2].trim())
.setId(Integer.parseInt(values[0].trim()));
});
}
}
我的自定义 JdbcBatchItemWriter : AbstractJdbcBatchItemWriter.java
public abstract class AbstractJdbcBatchItemWriter<T> extends JdbcBatchItemWriter<T>{
@Autowired
public AbstractJdbcBatchItemWriter(String SQL_QUERY) {
setSql(SQL_QUERY);
}
@Autowired
@Override
public void setItemSqlParameterSourceProvider(
@Qualifier("beanPropertyItemSqlParameterSourceProvider") ItemSqlParameterSourceProvider provider){
super.setItemSqlParameterSourceProvider(provider);
}
@Autowired
@Override
public void setDataSource(@Qualifier("mysqlDataSource") DataSource dataSource){
super.setDataSource(dataSource);
}
}
这是我的编写器实现:MySQLWriter.java
@Component
public class EducationMysqlWriter extends AbstractJdbcBatchItemWriter<Education> {
public EducationMysqlWriter(){
super("");
try {
setSql("UPDATE ecole SET nom=:name WHERE id=:id");
} catch (EmptyResultDataAccessException exception){
setSql("INSERT INTO ecole (nom, id) VALUES (:name, :id");
}
}
}
我需要更新行,但如果失败 (EmptyResultDataAccessException) 我需要进行插入。 但是 EmptyResultDataAccessException 显示在日志控制台上并终止了作业,但是 MySQLWriter.java 永远无法捕获异常...
【问题讨论】:
-
JdbcBatchItemWriter#setSql不会抛出异常,因为它只会将字符串分配给实例变量。 -
是的,我知道,但我认为尝试通过 write 方法(之后调用)进行更深层次的尝试。抛出它的方法?重写 write 方法?
标签: sql spring jakarta-ee spring-batch