Spring Batch的ItemWriter是单例类吗?

时间:2015-12-25 21:55:54

标签: java multithreading spring spring-batch

我有一个批处理作业,其定义如下:

<batch:job id="job">
    <batch:split id="main" task-executor="simpleAsyncTaskExecutor">
        <batch:flow>
            <batch:step id="getAccountDetails">
                <batch:tasklet ref="getAccountDetailsTasklet"/>
            </batch:step>
        </batch:flow>
        <batch:flow>
            <batch:step id="processAccounts">
                <batch:tasklet transaction-manager="transactionManager" task-executor="threadPoolTaskExecutor" throttle-limit="${processor.maxThreads}">
                    <batch:chunk reader="queueReader" writer="myCustomItemWriter" commit-interval="${processor.commitInterval}"/>
                </batch:tasklet>
            </batch:step>
        </batch:flow>
    </batch:split>
</batch:job>

myCustomItemWriter基本上会查看queueReader传递的帐户列表,并将它们提交到数据库。

该作业被缩放为并行运行该块的100个线程。在myCustomItemWriter的类中,我有一个私有属性,它维护它处理的每个帐户的特定BigDecimal属性的总和。因此,如果有10000个帐户,我将有100个线程,每个处理100个帐户。我想为所有这10000个帐户捕获此属性的总和。

这是我的问题:是ItemWriter单例(因此,只是一个保持这个总和的私有属性就足够了)?如果没有,我应该将我的计数器定义为AtomicReference bean并将其注入我的编写器中,以便在所有100个线程中注入相同的属性实例吗?

1 个答案:

答案 0 :(得分:1)

如果使用@Component注释作者,则默认范围将为单例。

但是所有批处理工件在它们在Job XML中声明的范围内使用之前都会被实例化,并且在其包含范围的生命周期内有效。有两个与工件生命周期相关的范围:jobstep

在您的案例中,您可以使用@Scope("step")注释您的CustomItemWriter,并且由于您正在运行多线程批处理,因此每个线程将创建自己的myCustomItemWriter实例,该实例仅适用于当前执行步骤

相关问题