使用 select 查询从数据库中读取的批处理 Tasklet
Batch Tasklet to read from database with select query
我如何创建一个 tasklet class 以从 DB 进行自定义 select 查询并将数据传递给下一个 tasklet?我必须使用 tasklet(没有 jdbcReader 或任何 reader)
代码示例:
public class Taskletreader implements Tasklet, StepExecutionListener{
private final Logger logger = LoggerFactory.getLogger(Taskletreader.class);
@Autowired
private DataSource dataSource;
private List<FichierEclate> FichierEclates;
private String query="select * from FicherEclate where .......some conditions...."
@Override
public void beforeStep(StepExecution stepExecution) {
FichierEclates = new ArrayList<FichierEclate>();
logger.debug("Reader initialized.");
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
new JdbcTemplate(dataSource)
.execute(query);
return RepeatStatus.FINISHED;
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
// fu.closeReader();
stepExecution
.getJobExecution()
.getExecutionContext()
.put("FichierEclates", this.FichierEclates);
logger.debug("Reader ended.");
return ExitStatus.COMPLETED;
}
}
无法理解 select 的结果在哪里以及如何将其传递给下一个 tasklet 进行处理?
Can't understand where is the result of the select
如果要消费查询的结果,可以在JdbcTemplate
上使用query
方法:
List<FichierEclate> fichierEclates = jdbcTemplate.query(query, new BeanPropertyRowMapper<>(FichierEclate.class));
此方法接受 RowMapper
将数据库中的每一行映射到域对象的一个实例。该示例使用 BeanPropertyRowMapper
,但您可以根据需要提供自定义映射器。
how to pass it to next tasklet for processing ?
您可以像以前那样使用执行上下文。但是,您不应该传递整个项目列表。执行上下文是持久化的,不建议像这样在步骤之间传递大量数据。项目 ID 的列表可能没问题,但整个项目对象的列表不是一个好主意。有关详细信息,请参阅参考文档的 Passing Data to Future Steps 部分。
也就是说,我真的建议为此使用面向块的 tasklet。我知道你说 I have to use tasklet (no jdbcReader or any reader)
,但我不明白这个限制。
我如何创建一个 tasklet class 以从 DB 进行自定义 select 查询并将数据传递给下一个 tasklet?我必须使用 tasklet(没有 jdbcReader 或任何 reader)
代码示例:
public class Taskletreader implements Tasklet, StepExecutionListener{
private final Logger logger = LoggerFactory.getLogger(Taskletreader.class);
@Autowired
private DataSource dataSource;
private List<FichierEclate> FichierEclates;
private String query="select * from FicherEclate where .......some conditions...."
@Override
public void beforeStep(StepExecution stepExecution) {
FichierEclates = new ArrayList<FichierEclate>();
logger.debug("Reader initialized.");
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
new JdbcTemplate(dataSource)
.execute(query);
return RepeatStatus.FINISHED;
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
// fu.closeReader();
stepExecution
.getJobExecution()
.getExecutionContext()
.put("FichierEclates", this.FichierEclates);
logger.debug("Reader ended.");
return ExitStatus.COMPLETED;
}
}
无法理解 select 的结果在哪里以及如何将其传递给下一个 tasklet 进行处理?
Can't understand where is the result of the select
如果要消费查询的结果,可以在JdbcTemplate
上使用query
方法:
List<FichierEclate> fichierEclates = jdbcTemplate.query(query, new BeanPropertyRowMapper<>(FichierEclate.class));
此方法接受 RowMapper
将数据库中的每一行映射到域对象的一个实例。该示例使用 BeanPropertyRowMapper
,但您可以根据需要提供自定义映射器。
how to pass it to next tasklet for processing ?
您可以像以前那样使用执行上下文。但是,您不应该传递整个项目列表。执行上下文是持久化的,不建议像这样在步骤之间传递大量数据。项目 ID 的列表可能没问题,但整个项目对象的列表不是一个好主意。有关详细信息,请参阅参考文档的 Passing Data to Future Steps 部分。
也就是说,我真的建议为此使用面向块的 tasklet。我知道你说 I have to use tasklet (no jdbcReader or any reader)
,但我不明白这个限制。