决定是Spring Batch Step、Tasklet还是Chunk [英] Deciding between Spring Batch Step, Tasklet or Chunks

查看:19
本文介绍了决定是Spring Batch Step、Tasklet还是Chunk的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的要求,我需要(从数据库)读取项目列表,并需要处理这些项目,一旦处理完毕,就必须将其更新到数据库中。

我正在考虑将Spring Batch块与阅读器、处理器和编写器一起使用。我的阅读器将从列表中一次返回一项,并将其发送到处理器,一旦处理结束,它将返回到Writer,在那里它更新数据库

稍后我可能会对其进行多线程处理,但这些方法需要一些同步开销。

在这里我预见到几个问题。

  1. 要处理的项目数可能更多。可能在10,000或更多。
  2. 处理器需要进行一些逻辑计算。因此,一次处理一个项目。即使是具有10个线程的多线程,也无法确定性能。
  3. 编写器可以更新数据库中该已处理项目的结果。不确定如何进行批量更新,因为它始终只有1个项目已处理并准备就绪。

对于这种用例,这种方法正确吗?或者可以做更好的事情? 有没有其他方法可以一次调用阅读器、处理机和编写器来处理一堆项目?如果是这样的话,我是否需要创建一些机制,比如从列表中提取10个项目并将其提供给处理器? 似乎写入器会在记录到来时更新每个记录,批量更新只有在写入器收到一堆已处理的项目时才有意义。有什么建议吗?

请注意此设计以获得更好的性能。

谢谢,

推荐答案

Spring Batch是满足您需要的完美工具。

面向块的步骤允许您使用Commit-Interval属性配置要读取/处理/写入的项目数。

        <batch:step id="step1" next="step2">
        <batch:tasklet transaction-manager="transactionManager" start-limit="100">
            <batch:chunk reader="myReader" processor="myProcessor" writer="MyWriter" commit-interval="800" />
            <batch:listeners>
                <batch:listener ref="myListener" />
            </batch:listeners>
        </batch:tasklet>
    </batch:step>
假设您的读者将调用返回10000条记录的SELECT语句。并将提交间隔设置为500。

MyReader将调用read()方法500次。假设在现实中,读取器实现实际上可能会从ResultSet中删除项。对于每个read()调用,它还将调用MyProcessor的process()方法。

但在达到提交间隔之前,它不会调用MyWriter的write()方法。

如果您查看接口ItemWriter的定义:

public interface ItemWriter<T> {

/**
 * Process the supplied data element. Will not be called with any null items
 * in normal operation.
 * 
 * @throws Exception if there are errors. The framework will catch the
 * exception and convert or rethrow it as appropriate.
 */
void write(List<? extends T> items) throws Exception;

}

您可以看到写入器收到一个项目列表。此列表将是您的提交间隔的大小(如果到达末尾,则小于此大小)

顺便说一句,10000条记录不算什么。如果您必须处理数百万条记录,可以考虑使用多线程。但即便如此,只需调整一下提交间隔值的最佳位置可能就足够了。

希望能有所帮助

这篇关于决定是Spring Batch Step、Tasklet还是Chunk的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆