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。再次感谢。