测量单个项目(读取器,处理器和写入器)的性能 - Spring Batch

时间:2016-11-30 09:55:55

标签: java spring-batch

我的问题与this SO Question非常相似,即我希望衡量个别项目的表现 - 读者,处理者和作家。

正如在回答链接问题时建议的那样,我添加了一个ItemReadListener<T>,但是当我使用JdbcPagingItemReader并且想要花时间阅读每个页面而不是单个项目时,这给了我每个阅读项目的时间。

处理器也是如此(也就是说,它会给我每个项目的时间),而我希望处理器花费时间来准备整个块。

ChunkListener看起来不合适,因为这会再次衡量读者,处理者和作家的合并时间。

我如何达到这个要求?

1 个答案:

答案 0 :(得分:1)

这是一个非线程安全的简单示例,用于计算处理器处理一个单独项目时的执行时间并记录总执行时间的可能解决方案。

public class PersonItemProcessor implements ItemProcessor<Person, Person> {

    private static final Logger log = LoggerFactory.getLogger(PersonItemProcessor.class);
    private static int count;
    private long processTime;

    @Override
    public Person process(final Person person) throws Exception {
        count++;
        long start = System.currentTimeMillis();    
        final String firstName = person.getFirstName().toUpperCase();
        final String lastName = person.getLastName().toUpperCase();

        final Person transformedPerson = new Person(firstName, lastName);

        // bear in mind that this will pollute the logging when processing millions of records
        log.info("Converting (" + person + ") into (" + transformedPerson + ")");
        log.info("Processing 1 item took " + (System.currentTimeMillis() - start) / 1e3 + " sec");

        processTime += System.currentTimeMillis() - start;    

        // use some interval value, here I used 5.
        // last few items won't be counted e.g. 18 items you will see this message 3 times.
        if (count == 5) {
            log.info(String.format("Processed %d items in %s sec", count, processTime / 1e3));
            count = 0;
        }
        return transformedPerson;       
    }

    public long getProcessTime(){
        return processTime;
    }
}

您可以找到其余代码here。只需将处理器调整到上方即可看到效果。

相同的逻辑可以应用于读写器。