【问题标题】:Measuring performance of individual items ( reader, processor and writer ) - Spring Batch测量单个项目(读取器、处理器和写入器)的性能 - Spring Batch
【发布时间】:2016-11-30 09:55:54
【问题描述】:

我的问题与this SO Question 非常相似,即我希望测量单个项目的性能 - 阅读器、处理器和编写器。

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

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

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

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

【问题讨论】:

  • 您可以使用 VisualMV 来分析您的应用程序
  • 我想在应用程序日志中记录这些时间以供将来使用和分析。我只能有效地记录编写器时间,因为这需要 List 的项目,我测量完成 write 方法所需的时间,但对于阅读器和处理器,我所能做的就是测量单个项目的时间,这非常没用。
  • 你可以写一个方面来记录所涉及的时间......

标签: java spring-batch


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

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

【讨论】:

  • 我猜,您还需要在if (count == 5) 中重置processTime。我已将我的块大小作为实例字段添加到处理器,并将 count 与它进行比较,留下边缘情况,即块大小为 1000 且总项目为 5423 ,日志将仅打印五次。
  • 如果您只对一定数量的项目(这里是 5 个)的 processTime 感兴趣,那么可以。正如我的示例评论中所指出的,残留项目不会被计算在内。
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 2018-03-23
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2018-01-21
相关资源
最近更新 更多