当前位置: 首页 > 知识库问答 >
问题:

没有重新执行Spring批处理步骤(缓存)

澹台鸿熙
2023-03-14

我正在做一个包括Spring批处理的项目,在复制代码片段之前,我要简单地总结一下这项工作是如何使用cron的。

  1. cron在我的项目上调用restapi(@PostMapping(“/jobs/external/{jobName}”)
  2. 在post方法中,我获取作业并执行它
  3. 在每次执行中,我都应该执行一个步骤
  4. 该步骤包含一个读卡器(对弹性API的外部rest调用以获取文档)和一个处理器

现在我的问题是:在catalina.out中,我可以按照cron中的配置,每隔10分钟看到cron的其余调用。但是,该步骤似乎并不是每10分钟调用一次弹性,批处理进程总是具有相同的数据集,这些数据集在tomcat重启期间调用批处理时读取一次。

工作Restapi:

@PostMapping("/jobs/external/{jobName}")
@Timed
public ResponseEntity start(@PathVariable String jobName) throws BatchException {
    log.info("LAUNCHING JOB FROM EXTERNAL : {}, timestamp : {}", jobName, Instant.now().toString());
    try {
        Job job = jobRegistry.getJob(jobName);
        JobParametersBuilder builder = new JobParametersBuilder();
        builder.addDate("date", new Date());
        return Optional.of(jobLauncher.run(job, builder.toJobParameters()))
            .map(BatchExecutionVM::new)
            .map(exec -> ResponseEntity
                .ok()
                .headers(HeaderUtil.createAlert("jobManagement.started", jobName))
                .body(exec))
            .orElseGet(() -> ResponseEntity.badRequest().build());
    } catch (NoSuchJobException aEx) {
        log.warn(JOB_NOT_FOUND, aEx);
        throw new BatchException();
    } catch (JobInstanceAlreadyCompleteException | JobExecutionAlreadyRunningException | JobRestartException aEx) {
        log.warn("Job execution error.", aEx);
        throw new BatchException();
    } catch (JobParametersInvalidException aEx) {
        log.warn("Job parameters are invalid.", aEx);
        throw new BatchException();
    }
}

作业配置:

@Bean
public Job usualJob() {
    return jobBuilderFactory
        .get("usualJob")
        .incrementer(new SimpleJobIncrementer())
        .flow(readUsualStep())
        .end()
        .build();
}

@Bean
public Step readUsualStep() {
    // TODO: simplifier on n'a pas besoin de chunk
    return stepBuilderFactory.get("readUsualStep")
        .allowStartIfComplete(true)
        .<AlertDocument, Void>chunk(25)
        .readerIsTransactionalQueue()
        .reader(rowItemReader())
        .processor(rowItemProcessor())
        .build();
}
@Bean
public ItemReader<AlertDocument> rowItemReader() {
    return new UsualItemReader(usualService.getLastAlerts());
}
@Bean
public UsualMapRowProcessor rowItemProcessor() {
    return new UsualMapRowProcessor();
}

我不知道为什么通常只调用ervice.getLastAlerts()一次,而不是每10分钟调用一次。

共有1个答案

常乐
2023-03-14

多亏了M. Deina,这基本上是解决方案:

    @Bean
@StepScope
public ItemReader<AlertDocument> rowItemReader() {
    return new UsualItemReader(usualService.getLastAlerts());
}

使用stepScope注释对StepBean进行注释将使其重新实例化每个步骤。

 类似资料:
  • 我正在尝试修复Spring Batch中的一个问题,这个问题最近一直困扰着我们的系统。我们有一份工作,在大多数情况下都很好。下载和处理数据是一个多步骤的工作。 问题是有时工作会爆棚。也许我们试图连接到的服务器抛出了错误,或者我们在工作进行到一半时关闭了服务器。此时,下次我们的quartz调度程序尝试运行该作业时,它似乎什么也不做。以下是此作业定义的删节版本: 委婉地说,我是Spring Batch

  • 我有一个spring批处理工作,比如说5个步骤(

  • 使用Spring Batch 3.0.4.Release。 我将作业配置为使用分区步骤。从机步骤使用块大小1。任务执行器中有六个线程。我使用从六到数百的各种网格大小来运行这个测试。我的网格大小是从StepExecutions的数量,我希望==我的分区器创建的ExecutionContexts的数量。 下面是Java配置代码:

  • 我对spring batch基本上是新手。第一步,我从SFTP服务器获取一个文件,并使用JSch将其传输到本地目录。第二步,我读取本地目录中的文件,并将内容写入数据库。问题在于,在某些情况下,只执行saveDruchAltransaction(步骤2),而不执行getRemoteFile(步骤1) 配置类: 读者: 作家: 微线程: 我不知道该怎么做...我一直在尝试我从各地找到的东西。请帮忙谢谢

  • 我有一个spring批处理作业,预计将根据FIFO顺序处理'N'个作业ID。这个Spring批处理作业有5个步骤。 我们使用DECIDER来确定是否有更多的job-id。如果是,请转到第一步并运行该job-id的所有步骤。 我在spring-batch发出的日志中看到“duplicate step”消息,在第一个作业中的步骤(例如job-id=1)获得未知状态之前,该消息似乎没有问题。在这种情况下

  • 我试图配置我的第一个多线程作业。我们有大约200,000条记录的主目录,我们需要处理。我想将文件分解为10个文件并处理它们。拆分文件tasklet工作正常 主步骤在我的配置中运行,但从步骤不运行。下面是我的配置。 分割者: MultiResourceItemReader: FlatFileItemWriter: 作业配置: 从属步骤配置: 请告知我做错了什么。我没有看到处理器urlFileItem