【问题标题】:Spring-boot - how to restart a job per scheduleSpring-boot - 如何按计划重新启动作业
【发布时间】:2014-05-30 13:11:57
【问题描述】:

我正在使用 spring-batch-2.2.5 开发一个 spring-boot 应用程序。 - 一个简单的应用程序 - 从数据库读取项目并写入文件。运行应用程序时有两个问题:

  1. 作业一次运行良好,但第二次(在 60 秒的固定延迟之后)似乎运行,但显示步骤状态为 Completed。

  2. 第二个问题,是我随机得到 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}]

【问题讨论】:

    标签: spring-batch spring-boot


    【解决方案1】:

    那里可能有 3 个问题,所以分解它可能会有所帮助。我可以在这里向您提问以节省 cmets 的空间...

    • 您在 2 个线程中有 2 次执行,因为一个来自 @Scheduled 执行(我猜是线程 ID),另一个来自 Spring 中实现的“启动时启动单个作业”规则启动(您可以将其关闭 - 参见docs,例如设置“spring.batch.job.enabled=false”)。

    • 您似乎对第二次执行成功完成感到惊讶,但您没有说明原因。有问题吗?

    • 如果您的进程要执行并发作业(看起来可能是这样),您应该将有状态组件设置为@StepScope。根据例外情况,项目编写器看起来是一个不错的候选人。

    【讨论】:

    • 谢谢@Dave,我把它放在一起,我认为它们是相互关联的。添加标志修复了问题 1 和 3。但是,我很惊讶第二次执行成功完成。我需要再次运行相同的作业,因为处理的记录可能不同。进程不需要并发,现在如果我一次处理一条记录就足够了。
    • 我认为您应该添加@StepScope 以确保安全。完成这项工作让你感到惊讶的是什么?在我看来这很正常。
    • 添加@StepScope 做到了。我很惊讶(相当不明白为什么)itemreader 没有检索新记录,工作开始,然后报告步骤已完成。将 StepScope 添加到 ItemReader 有效!谢谢戴夫!
    • 如果它是有状态的,那么它仍然有第一次执行的记忆,所以它可能认为它已经完成了所有输入记录的读取。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多