因此,我的场景深入到本质如下:本质上,我有一个包含一组SQL查询的配置文件,这些查询的结果集需要导出为CSV文件。由于一些查询可能会返回数十亿行,并且某些事情可能会中断进程(bug、崩溃…),我想使用spring-batch这样的框架,它为我提供了重启和作业监控功能。我正在使用一个基于文件的H2数据库来持久化春季批处理作业。
因此,以下是我的问题:
-
创建作业后,我需要为我的RowMapper提供一些初始配置。那么,当作业在例如崩溃后需要重新启动时会发生什么呢?具体而言:
- RowMapper的状态是否自动持久化,并且在重新启动时,Spring批处理将尝试从其数据库中恢复对象,或者
- 将使用作为原始spring-batch XML配置文件一部分的RowMapper对象,或者
- 我必须使用步骤/作业的ExecutionContext来维护RowMapper的状态
-
上面的问题与使用spring-batchXML配置时是否有魔力有关,或者我是否也可以用编程的方式创建所有这些bean:由于我需要将自己的配置格式解析为spring-batch作业配置,所以我宁愿只使用spring-battle的Java类(bean)并适当地填充它们,而不是尝试手动写出有效的XML。然而,如果我的工作崩溃了,我会重新创建所有的bean。spring-batch是否自动从其数据库中恢复作业状态?
-
如果我真的需要XML,有没有办法将spring-batchJobRepository(或其中一个对象)序列化为spring-batch XML配置?
-
现在,我试图用以下代码配置我的Step,但我不确定这是否是正确的方法:
- TaskletStep是一条路吗
- 我创建分块读写器的方式正确吗?或者我应该使用其他对象吗
-
我本以为打开读取器和写入器会作为JobExecution的一部分自动发生,但如果我在运行Job之前没有打开这些资源,我会收到一个异常,告诉我需要先打开它们。也许我需要创建一些其他对象来管理资源(jdbc连接和文件句柄)?
JdbcCursorItemReader<Foobar> itemReader = new JdbcCursorItemReader<Foobar>(); itemReader.setSql(sqlStr); itemReader.setDataSource(dataSource); itemReader.setRowMapper(rowMapper); itemReader.afterPropertiesSet(); ExecutionContext executionContext = new ExecutionContext(); itemReader.open(executionContext); FlatFileItemWriter<String> itemWriter = new FlatFileItemWriter<String>(); itemWriter.setLineAggregator(new PassThroughLineAggregator<String>()); itemWriter.setResource(outResource); itemWriter.afterPropertiesSet(); itemWriter.open(executionContext); int commitInterval = 50000; CompletionPolicy completionPolicy = new SimpleCompletionPolicy(commitInterval); RepeatTemplate repeatTemplate = new RepeatTemplate(); repeatTemplate.setCompletionPolicy(completionPolicy); RepeatOperations repeatOperations = repeatTemplate; ChunkProvider<Foobar> chunkProvider = new SimpleChunkProvider<Foobar>(itemReader, repeatOperations); ItemProcessor<Foobar, String> itemProcessor = new ItemProcessor<Foobar, String>() { /* Custom implemtation */ }; ChunkProcessor<Foobar> chunkProcessor = new SimpleChunkProcessor<Foobar, String>(itemProcessor, itemWriter); Tasklet tasklet = new ChunkOrientedTasklet<QuadPattern>(chunkProvider, chunkProcessor); //new SplitFilesTasklet(); TaskletStep taskletStep = new TaskletStep(); taskletStep.setName(taskletName); taskletStep.setJobRepository(jobRepository); taskletStep.setTransactionManager(transactionManager); taskletStep.setTasklet(tasklet); taskletStep.afterPropertiesSet(); job.addStep(taskletStep);
你们中的大多数问题都非常复杂,可能很难在不写长篇论文的情况下给出好的答案
我和你一样是spring-batch的新手,我发现了很多非常有用的信息-以及你问题的所有答案-阅读spring-batch:它已经完成,解释得很好,充满了示例,涵盖了框架的各个方面(读写器/处理器、作业/任务集/区块生命周期/持久性、tx/资源管理、作业流、与其他服务的集成、分区、重新启动/重试、故障管理和许多有趣的事情)
希望能帮助