【发布时间】:2020-08-24 16:36:39
【问题描述】:
我需要在作业步骤之间共享相对大量的数据以实现 Spring 批处理。我知道StepExecutionContext 和JobExecutionContext 作为这种机制。但是,我读到了,因为它们的大小必须受到限制(少于 2500 个字符)。这对我的需要来说太小了。在我的新手一步Spring Batch 实现中,我的单步工作如下:
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
private static final String GET_DATA =
" SELECT " +
"stuffA, " +
"stuffB, " +
"FROM STUFF_TABLE " +
"ORDER BY stuffA ASC";
@Bean
public ItemReader<StuffDto> databaseCursorItemReader(DataSource dataSource) {
return new JdbcCursorItemReaderBuilder<StuffDto>()
.name("cursorItemReader")
.dataSource(dataSource)
.sql(GET_DATA)
.rowMapper(new BeanPropertyRowMapper<>(StuffDto.class))
.build();
}
@Bean
ItemProcessor<StuffDto, StuffDto> databaseXmlItemProcessor() {
return new QueryLoggingProcessor();
}
@Bean
public ItemWriter<StuffDto> databaseCursorItemWriter() {
return new LoggingItemWriter();
}
@Bean
public Step databaseCursorStep(@Qualifier("databaseCursorItemReader") ItemReader<StuffDto> reader,
@Qualifier("databaseCursorItemWriter") ItemWriter<StuffDto> writer,
StepBuilderFactory stepBuilderFactory) {
return stepBuilderFactory.get("databaseCursorStep")
.<StuffDto, StuffDto>chunk(1)
.reader(reader)
.writer(writer)
.build();
}
@Bean
public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep,
JobBuilderFactory jobBuilderFactory) {
return jobBuilderFactory.get("databaseCursorJob")
.incrementer(new RunIdIncrementer())
.flow(exampleJobStep)
.end()
.build();
}
}
从某种意义上说,这很好用,我可以成功地从数据库中读取数据并在写入器步骤中写入这样的 loggingitemwriter:
public class LoggingItemWriter implements ItemWriter<StuffDto> {
private static final Logger LOGGER = LoggerFactory.getLogger(LoggingItemWriter.class);
@Override
public void write(List<? extends StuffDto> list) throws Exception {
LOGGER.info("Writing stuff: {}", list);
}
}
但是,我需要能够将 StuffDto(或等效项)和它的数据提供给第二步,该步骤将对它执行一些处理,而不仅仅是记录它。
如果您认为步骤和工作环境过于有限,我将不胜感激。谢谢。
【问题讨论】:
-
您将它们存储在某个临时存储库中,例如数据库或文件系统?
-
我正在寻找一个希望在 springbatch 的上下文中传达的解决方案
-
只需创建一个复合编写器,它会记录日志然后进行分析。基本上,您将登录硬塞进了一个单独的步骤。哎呀,您甚至可以为此使用
ItemListener或StepListener并记录书面项目(这可能更适合该任务)。 -
您定义了一个项目处理器,但您没有在步骤上设置它。这是故意的吗?
performing some processing against it rather than just logging it:您可以在项目处理器中实现该处理。您确定需要进行第二步处理吗? -
@M.Deinum,谢谢。是否可以解释我如何使用 itemlistener 或 steplistener 共享第二步的数据?谢谢。
标签: java spring spring-batch