测量弹簧批步执行时间

时间:2017-09-21 14:13:56

标签: java spring-batch

在春季批次中测量步骤执行时间的正确方法是什么?

这是一个步骤的例子:

@Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .<POJO, POJO> chunk(10)
                .reader(pojoReader())
                .processor(pojoProcessor())
                .build();
    }

我在使用ItemWriter和IemReader

之前使用了一些示例
public class xxxxxItemReader implements xxxxItemReader <XXXX>{

    private Logger log = LoggerFactory.getLogger(this.getClass());

    @Override
    public void beforeJob(JobExecution jobExecution) {
        //
        // Can Log || do some business code
        //
        log.info("Intercepting Job Excution - Before Job!");
    }

    @Override
    public void afterJob(JobExecution jobExecution) {
        //
        // Can Log || do some Business code
        //
        log.info("Intercepting Job Excution - After Job!");
    }

}

在这种情况下,我应该使用我的ItemWriter和itemReader之前的步骤和之后的步骤,并最终将它放在一起(添加)以获得holl步执行时间?这是最好的方式吗?

2 个答案:

答案 0 :(得分:0)

您共享的听众是org.springframework.batch.core.JobExecutionListener,而对于某个步骤的类似方法,您需要使用 - org.springframework.batch.core.StepExecutionListener并实施方法 - void beforeStep(StepExecution stepExecution)&amp; ExitStatus afterStep(StepExecution stepExecution);

通过实现上面的接口&amp;创建一个监听器类。在步骤中配置。

然后在此监听器中定义一个实例字段,例如 - long startTime并将其设置为startTime= System.nanoTime();中的beforeStep,然后放在afterStep中,此字符串可以传递给您记录器以毫秒为单位记录时间 - (System.nanoTime() - startTime) / 1e6 + "ms."

或者,元数据库表 - BATCH_STEP_EXECUTION具有以下时间 - START_TIME&amp; END_TIME列。您可以编写脚本以将这些时间转储到某个文件或以任何所需格式检索。

我不确定您是否使用Spring Boot但请参考here

此外,请确保您的配置未使用具有HSQL或H2数据库的内存存储库。

答案 1 :(得分:0)

您可以在工作上使用JobExecutionListener

@Bean
public Job helloJob() {
    return jobBuilderFactory.get("HelloJob")
        ...
        .listener(new JobExecutionListener() 
        {

            @Override
            public void beforeJob(JobExecution jobExecution) 
            {
                // do nothing
            }

            @Override
            public void afterJob(JobExecution jobExecution) 
            {
                // get job's start time
                Date start = jobExecution.getCreateTime();

                //  get job's end time
                Date end = jobExecution.getEndTime();

                // get diff between end time and start time
                long diff = end.getTime() - start.getTime();

                // log diff time
                log.info(TimeUnit.SECONDS.convert(diff, TimeUnit.MILLISECONDS));
            }
        })
        ...
        .build();
}