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

Spring批处理作业执行监听器-访问JobStep定义的子作业的详细信息

沈子昂
2023-03-14

我有一份工作(父母工作)的工作(孩子)。在父作业的jobexecution侦听器中,我希望访问每个子作业的所有细节(作业名、步骤名、读/写计数等)。我怎样才能做到这一点?

public class ParentJobConfig {

    @Bean
    public Job job1() {
        Job job = jobBuilderFactory.get("JOB1")
                .incrementer(new RunIdIncrementer())
                .start(step11())
                .next(step12())
                .build();
        return job;
    }

    @Bean
    public Job job2() {
        Job job = jobBuilderFactory.get("JOB2")
                .incrementer(new RunIdIncrementer())
                .start(step21())
                .next(step22())
                .build();
        return job;
    }

    @Bean
    public Step jobStep1() {
        Step step = stepBuilderFactory.get("JOB-STEP1")
                .job(job1())
                .parametersExtractor(new DefaultJobParametersExtractor())
                .build();
        return step;
    }

    @Bean
    public Step jobStep2() {
        Step step = stepBuilderFactory.get("JOB-STEP2")
                .job(job2())
                .parametersExtractor(new DefaultJobParametersExtractor())
                .build();
        return step;
    }

    @Bean
    public Job parentJob() {
        Job job = jobBuilderFactory.get("PARENT-JOB")
                .incrementer(new RunIdIncrementer())
                .start(jobStep1())
                .next(jobStep2())
                .listener(parentJobExecutionListener())
                .build();
        return job;
    }

    @Bean
    public JobExecutionListener parentJobExecutionListener() {
        return new ParentJobExecutionListener ();
    }
}

public class ParentJobExecutionListener extends JobExecutionListenerSupport {

    @Override
    public void afterJob(JobExecution jobExecution) {
        List<StepExecution> stepExecutions = (List<StepExecution>) jobExecution.getStepExecutions();
        Collection<StepExecution> stepExecutions = jobExecution.getStepExecutions();
        for (StepExecution stepExecution : stepExecutions) {
            System.out.println("Step Name: " + stepExecution.getStepName());
            System.out.println("Read Count: " + stepExecution.getReadCount());
            System.out.println("Skip Count: " + stepExecution.getSkipCount());
            System.out.println("Write Count: " + stepExecution.getWriteCount());
        }
    }
}

共有1个答案

管峻
2023-03-14

我没有看到一种明显的方法来访问这里创建的子作业执行:https://github.com/spring-projects/spring-batch/blob/d8fc58338d3b059b67b77adc132d2564d7402/spring-batch-core/src/main/java/org/springframework/batch/core/step/jobstep.java#l119(只有状态反映在步骤执行上)。

您所能做的就是在侦听器中使用作业资源管理器,并查询存储库中的子作业执行。

 类似资料:
  • 我的spring批处理应用程序运行在连接到MySQL数据库(单实例)的PCF平台上,只有一个实例启动时运行良好

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 我正在使用sping-xd通过批处理作业进行数据摄取。大量作业在4个容器中并行运行。任何地方都在10到40个作业之间。其中大多数在不到一分钟的时间内完成。我使用redis(而不是Rabbitmq)和mysql进行数据存储。Spring-xd-批处理使用不同的mysql-db进行作业/步骤统计,我的应用程序使用不同的mysql-db用于自己的目的。两个mysql-db都在同一台服务器上。所有4个容器

  • 我有以下Spring批处理作业配置: 我用以下代码开始这项工作: 如何从作业步骤访问参数?

  • 我当时正在开发一个Spring批处理应用程序,使用java配置执行两个批处理作业。最近,我添加了一个Spring调度程序来调度我编写的一个作业。侦听器在作业第一次完成时被调用,但在下一次执行后不会被调用。以下是我的作业配置代码: 下面是我的调度程序的代码: 我的听众如下: 以下是控制台输出: 请告诉我我做错了什么,为什么听者没有被执行后续尝试。

  • Spring批处理作业与flatfileitemreader(从csv读取)、processor(更新adwords api提要详细信息,对于csv文件中的每个记录(大约有40条记录),这一步大约需要40秒)和正在更新DB中记录的定制writer一起使用。 web.xml