测量单个项目(reader、处理器和编写器)的性能 - Spring 批处理

Measuring performance of individual items ( reader, processor and writer ) - Spring Batch

我的问题与 this SO Question 非常相似,即我想衡量单个项目的性能 - reader、处理器和编写器。

正如在回答链接问题时所建议的那样,我添加了一个 ItemReadListener<T> 但这让我在使用 JdbcPagingItemReader 时为每个阅读项目留出了时间,并且希望花时间阅读每一页而不是个别项目。

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

A ChunkListener 看起来也不合适,因为这将再次测量 reader、处理器和编写器的组合时间。

我怎样才能达到这个要求?

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

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。把处理器调到上面就可以看到效果了

可以将相同的逻辑应用于 reader/writer。