gpt4 book ai didi

java - Spring Batch 的 ItemWriter 是单例类吗?

转载 作者:搜寻专家 更新时间:2023-11-01 03:35:04 27 4
gpt4 key购买 nike

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

<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 传递的帐户列表并将它们提交到数据库。

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

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

最佳答案

如果您使用 @Component 注释您的编写器,则默认范围将是单例。

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

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

关于java - Spring Batch 的 ItemWriter 是单例类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34466770/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com