Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是弹簧批';这是一个单例类吗?_Java_Multithreading_Spring_Spring Batch - Fatal编程技术网

Java 是弹簧批';这是一个单例类吗?

Java 是弹簧批';这是一个单例类吗?,java,multithreading,spring,spring-batch,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="getAccountD

我有一个具有以下定义的批处理作业:

<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 singleton(因此,仅仅拥有一个私有财产来维持这个总数就足够了)吗?如果不是,我是否应该将我的计数器定义为AtomicReference bean,并将其注入我的编写器中,以便在所有100个线程中都注入相同的属性实例?

如果使用
@Component
注释编写器,默认范围将是singleton

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


在您的情况下,您可以使用
@Scope(“步骤”)
注释CustomItemWriter,因为您正在运行一个多线程批处理,每个线程将创建自己的
myCustomItemWriter
实例,该实例将仅适用于当前执行的步骤。

谢谢您的回答。@Scope(“步骤”)不应该为整个步骤创建一个实例吗?我希望所有线程都使用相同的实例,而不是创建一个新实例。让我试试@Component。再次感谢。