- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个具有以下定义的批处理作业:
<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 中声明的范围内使用之前实例化,并且在其包含范围的生命周期内有效。有两个范围与工件生命周期有关:job
和 step
。
在您的案例中,您可以使用 @Scope("step")
注释您的 CustomItemWriter,并且由于您运行的是多线程批处理,因此每个线程都将创建自己的 myCustomItemWriter
仅在当前执行步骤中存在。
关于java - Spring Batch 的 ItemWriter 是单例类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34466770/
我正在尝试从数据库中选择数据,更新每个对象,然后更新项目写入器中的数据库。 我尝试在每次更新后刷新 DAO,但它没有改变任何内容。 配置非常基本,包括读取器、写入器和 100 的提交间隔。 阅读器正在
引用论坛中一个从未得到答案的老问题: Is it on purpose that I get an empty List as an input to the ItemWriter.write() m
我有一个 ItemWriter 的实现,它很好地保留了我的所有值对象。当第一个值对象(用于批处理作业)传递到 ItemWRiter 时,我可以执行单独的数据库插入,并保证进入 ItemWriter 的
我有一个域类如下 class SubScritpion{ private String subScripId; private String useId; private Date subSc
我读取了一个平面文件(例如每个用户 1 行的 .csv 文件,例如:UserId;Data1;Date2)。 但是如何处理阅读器中重复的用户项(其中没有以前阅读过的用户的列表...) stepBuil
我有以下代码 @Bean public JdbcBatchItemWriter writer1() { return new JdbcBatchItemWriterBuilder()
我正在尝试使用SpringBoot编写spring批处理。首先,程序将从数据库中读取数据,然后将其写入.csv格式的文件。 这是我尝试过的代码 阅读器 @Bean public Ite
我有一个简单的 Spring Batch 作业,有几个步骤,最后一步是编写报告,所以我有 ItemReader、ItemProcessor 和 ItemWriter。 ItemWriter 按 blo
我们的处理器返回 List (有效地将 List> )传递给我们的 ItemWriter . 现在,我们观察到 JdbcBatchItemWriter未编程处理 item instanceof Lis
我正在尝试使用以下配置来配置没有项目编写器的 Spring 批处理步骤。但是我得到错误说那个作家 element 既没有“writer”属性也没有元素。 我浏览了链接spring batch : Ta
我正在尝试生成以下格式的平面文件,该文件没有任何分隔符。 客户.java private String customerId; private String customerName; MyFla
我有一个 MultiResourceItemReader,可以从文件夹加载多个 csv 文件。 对于每个文件,我想更改 ItemWriter 生成的文件名。但是:怎么办? @Bean public M
我想从数据库写入json格式文件。我有这个 ItemWriter 实现的原型(prototype),非常简单。 import java.util.ArrayList; import java.util
我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统。在这种情况下,这就像在传递给 ItemWriter 之前使用 RowMapper 实现从查询构建对象一样简单。 It
我开发了一个批处理 - 使用 spring batch ,它从数据库生成文件。 如果没有找到匹配的记录 - 批处理生成空文件。 如果没有找到匹配的记录,我想跳过这个文件生成。 我尝试寻求帮助,但没有找
本题是关于使用Window Media API输出4K WMV视频(虽然理论上WMV不支持输出到4K) 在 32 位和 64 位 Win10 上调用 IWMWriter->BeginWriting()
我在没有 ItemWriter 的情况下定义了我的 tasklet : 我得到了这个错误: 配置问题:元素既没有 'writer' 属性也没有 元素。 你有什么想法吗?谢谢 最佳答案 好
我有一个具有以下定义的批处理作业:
我是 Spring 批处理的新手,所以也许我错了,但我不明白为什么 itemWriter 中的 write 方法需要数据列表: void write(List items) throws Except
我要检索 JobParameter和 JobExecutionContext我的 ItemWriter 中的对象类(class)。 如何进行? 我尝试实现 StepExecutionListener通
我是一名优秀的程序员,十分优秀!