【发布时间】:2014-05-30 13:11:57
【问题描述】:
我正在使用 spring-batch-2.2.5 开发一个 spring-boot 应用程序。 - 一个简单的应用程序 - 从数据库读取项目并写入文件。运行应用程序时有两个问题:
作业一次运行良好,但第二次(在 60 秒的固定延迟之后)似乎运行,但显示步骤状态为 Completed。
-
第二个问题,是我随机得到 WriterNotOpenException: Writer must be open before it can be write to。这发生在第一次运行。一些项目已写入,但随后发生异常。
在 org.springframework.batch.item.file.FlatFileItemWriter.write(FlatFileItemWriter.java:255) ~[spring-batch-infrastructure-2.2.5.RELEASE.jar:na] 在 org.springframework.batch.core.step.item.SimpleChunkProcessor.writeItems(SimpleChunkProcessor.java:175) ~[spring-batch-core-2.2.5.RELEASE.jar:na] 在 org.springframework.batch.core.step.item.SimpleChunkProcessor.doWrite(SimpleChunkProcessor.java:151) ~[spring-batch-core-2.2.5.RELEASE.jar:na] 在 org.springframework.batch.core.step.item.SimpleChunkProcessor.write(SimpleChunkProcessor.java:274) ~[spring-batch-core-2.2.5.RELEASE.jar:na]
我确保 JobParameters 每次运行都有一个新的时间戳,但这似乎没有帮助。
代码如下:
public ItemReader<DomainClass> reader() {
ArrayList<DomainClass> records = service.findrecords()
return new IteratorItemReader<DomainClass>(records)
}
@Bean
public ItemProcessor<DomainClass, DomainClass> processor() {
return new MyItemProcessor()
}
@Bean
public FlatFileItemWriter<DomainClass> writer() {
FlatFileItemWriter flatFileItemWriter = new FlatFileItemWriter()
DelimitedLineAggregator t = new DelimitedLineAggregator(delimiter: ',')
t.setFieldExtractor(new BeanWrapperFieldExtractor(names: ["id", "description", "type", "date"]))
flatFileItemWriter.setLineAggregator(t)
flatFileItemWriter.setResource(new FileSystemResource('output.txt'))
return flatFileItemWriter
}
@Bean
public Job myJob(JobBuilderFactory jobs, Step s1) {
Job job = jobs.get("myJob")
.incrementer(new RunIdIncrementer())
.flow(s1).end().
.build()
return job
}
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader<DomainClass> reader,
ItemWriter<DomainClass> writer, ItemProcessor<DomainClass, DomainClass> processor) {
logger.info "creating step1"
return stepBuilderFactory.get("step1")
.<DomainClass, DomainClass> chunk(10)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
这是第二次尝试的状态:没有错误,但步骤显示已完成。我不确定如何在上面的代码中将作业设置为“可重新启动”。
INFO com.myapp.MyJobsApplication - Running MyJobs...
INFO o.s.b.c.l.support.SimpleJobLauncher - Job: [FlowJob: [name=myJob]] launched with the following parameters: [{time=1397603933056}]
INFO o.s.batch.core.job.SimpleStepHandler - Executing step: [step1]
INFO o.s.b.c.l.support.SimpleJobLauncher - Job: [FlowJob: [name=myJob]] completed with the following parameters: [{time=1397603933056}] and the following status: [COMPLETED]
查看 spring boot 启动跟踪,似乎有两个线程试图启动(main 和 pool-3-thread-1)。不确定这是否也是一个问题:
18:17:46.441 [pool-3-thread-1] INFO o.s.b.c.l.support.SimpleJobLauncher - Job: [FlowJob: [name=myJob]] launched with the following parameters: [{time=1397603866386}]
18:17:46.463 [main] INFO o.s.b.c.l.support.SimpleJobLauncher - Job: [FlowJob: [name=myJob]] launched with the following parameters: [{run.id=2}]
【问题讨论】: