- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道这样的流程:
ItemReader -> ItemProcessor -> ItemWriter
其中每一个都是实现等效接口(interface)的自定义类,并且在面向 block 的步骤中,何时调用每个构造函数?
据我所知(如果我错了请纠正我)ItemWriter 构造函数将在步骤开始时被调用一次,并且对于每个 block ,只调用 write()。此规则适用于其他 2 个吗?
最佳答案
Vinay 的回答是正确的,但需要一些详细说明。
对于 reader-processor->writer Spring 调用默认构造函数(让我们忽略 @PostConstruct 等)Scope(“step”),顾名思义就是为每一步创建一个新的bean。Step 不必与线程一对一,例如假设我有以下 reader-processor->writer
@Component
@Scope("step")
public class DoNothingItemReader implements ItemReader<String>{
public DoNothingItemReader() {
LOGGER.info(String.format("New %s created"
,ClassUtils.getShortName(this.getClass())));
}
@Override
public String read() throws Exception{
LOGGER.info("Nothing to read...");
..
}
}
@Component
@Scope("step")
public class DoNothingItemProcessor implements ItemProcessor<String, String> {
public DoNothingItemProcessor() {
LOGGER.info(String.format("New %s created"
,ClassUtils.getShortName(this.getClass())));
}
@Override
public String process(String i) throws Exception {
LOGGER.info("Nothing to process...");
return i;
}
}
@Component
@Scope("step")
public class DoNothingItemWritter implements ItemWriter<String[]> {
public DoNothingItemWritter() {
LOGGER.info(String.format("New %s created"
,ClassUtils.getShortName(this.getClass())));
}
@Override
public void write(List<? extends String[]> items) throws Exception {
LOGGER.info("Nothing to write...");
}
现在我们分两步重用上面的内容,例如
<batch:job id="testScopStep">
<batch:step id="step1" next="step2">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="doNothingItemReader"
processor="doNothingItemProcessor"
writer="doNothingItemWritter" commit-interval="3">
</batch:chunk>
</batch:tasklet>
</batch:step>
<batch:step id="step2">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="doNothingItemReader"
processor="doNothingItemProcessor"
writer="doNothingItemWritter" commit-interval="3">
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
每次读取器->处理器->写入器
构造函数将被调用两次日志将是
[SimpleJobLauncher] - <Job: [FlowJob: [name=testScopStep]] launched>
[SimpleStepHandler] - <Executing step: [step1]>
[DoNothingItemReader] - <New DoNothingItemReader created>
[DoNothingItemReader] - <Nothing to read...>
[DoNothingItemReader] - <Nothing to read...>
[DoNothingItemReader] - <Nothing to read...>
[DoNothingItemProcessor] - <New DoNothingItemProcessor created>
[DoNothingItemProcessor] - <Nothing to process...>
[DoNothingItemProcessor] - <Nothing to process...>
[DoNothingItemWritter] - <New DoNothingItemWritter created>
[DoNothingItemWritter] - <Nothing to write...>
[SimpleStepHandler] - <Executing step: [step2]>
[DoNothingItemReader] - <New DoNothingItemReader created>
[DoNothingItemReader] - <Nothing to read...>
[DoNothingItemReader] - <Nothing to read...>
[DoNothingItemReader] - <Nothing to read...>
[DoNothingItemProcessor] - <New DoNothingItemProcessor created>
[DoNothingItemProcessor] - <Nothing to process...>
[DoNothingItemProcessor] - <Nothing to process...>
[DoNothingItemWritter] - <New DoNothingItemWritter created>
[DoNothingItemWritter] - <Nothing to write...>
[SimpleJobLauncher] - <Job: [FlowJob: [name=testScopStep]] completed
现在考虑以下使用复合编写器的场景
<batch:job id="testScopStep">
<batch:step id="step1">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="doNothingItemReader"
processor="doNothingItemProcessor"
writer="compositeWriter" commit-interval="3">
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
这里的构造函数只会被调用一次。
日志会显示
[SimpleJobLauncher] - <Job: [FlowJob: [name=testScopStep]] launched>
[SimpleStepHandler] - <Executing step: [step1]>
[DoNothingItemReader] - <New DoNothingItemReader created>
[DoNothingItemReader] - <Nothing to read...>
[DoNothingItemReader] - <Nothing to read...>
[DoNothingItemReader] - <Nothing to read...>
[DoNothingItemProcessor] - <New DoNothingItemProcessor created>
[DoNothingItemProcessor] - <Nothing to process...>
[DoNothingItemProcessor] - <Nothing to process...>
[DoNothingItemWritter] - <New DoNothingItemWritter created>
[DoNothingItemWritter] - <Nothing to write...>
[DoNothingItemWritter] - <Nothing to write...>
[SimpleJobLauncher] - <Job: [FlowJob: [name=testScopStep]] completed
所以在这种情况下,我们应该小心考虑到我们共享同一个作者。
关于java - 在 Spring Batch 中调用 ItemReader、ItemProcessor、ItemWriter 的构造函数时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22254789/
我已经创建了我的自定义 ItemReader: @Component("pricereader") public class MyItemReader implements ItemReader{ @
我正在尝试访问 itemReader 中的 JobParameters,我遵循了 Spring 用户指南中的“作业和步骤属性的后期绑定(bind)”,但无法使其工作。 这是我的配置: Spring 批
我正在从数据库中读取数据,它有很多行,是的,但是“我认为读者在该步骤中释放了内存”。它需要超过 1Gb 的内存。怎样才能改善呢?使用另一种阅读器? ...
我正在使用 Spring Batch 的 ItemReader 来读取文件 我的输入文件包含由 分隔的一长串字符串, 如下所示: 2333,443445,5555,3344... 每个字符串都应该转换
我用 JdbcTemplate 实现了 ItemReader 。 问题是 read() 在无限循环中被调用。 public class MyReader implements ItemReader,
使用 Spring Batch 我试图将输入文件的每一行作为 String 提供给 ItemProcessor 而 中没有任何“CSV 解析”项目阅读器。 我提出了一个包含以下 reader() 方法
在我的 springbatch+quartz 设置中,我正在使用 FlatFileItemReader 读取一个 CSV 文件。我想为读者设置光标以使用给定的读者参数启动下一个作业实例。是否可以?
以下是我的 Spring Batch 用例。 从 Web 服务读取输入。 Web 服务将返回所有记录。 处理记录。 将处理过的记录一一写入。 我很清楚第 2 步和第 3 步,但无法弄清楚如何实现一个可
我有一个 Spring Batch 应用程序,它使用 JdbcCursorItemReader 从数据库表中读取数据,并使用 FlatFileItemWriter 将其写入平面文件。 当我测试我的应用
我有一个 Spring Batch 应用程序,它使用 JdbcCursorItemReader 从数据库表中读取数据,并使用 FlatFileItemWriter 将其写入平面文件。 当我测试我的应用
我正在尝试读取固定长度的文本文件并使用 spring Batch 将其寄存器导入数据库,但输入文件的常规布局是嵌套的,类似于(添加制表只是为了简化可视化): FILE HEADER ENTER
我想验证文件名和记录。我的应用上下文如下 我的项目阅读器上下文如下所示
我在我的批处理 Spring 项目中定义了一个作业流,并定义了 ItemReader、ItemProcessor、ItemWriter 等 我的 ItemReader 如下代码: @Component
我有一个带有简单自定义读取器和写入器的 Spring Batch 项目。当我运行代码时,我最终会出现一个无限循环,打印第一个项目“项目 1”。我究竟做错了什么? 这是我的代码: Reader.java
我刚刚开始使用 Spring Batch,想知道维护要在 ItemReader 中读取的项目列表的最佳实践是什么。我看到的例子是这样的: private static List items = new
我目前有一个应用程序,我正在尝试诊断我在设置中所做的错误,但没有运气确定为什么它在非常特定的情况之外无法工作。 首先是我正在使用的代码。 配置.java @EnableBatchProcessing
我正在尝试使用 ListItemReader 创建一个 Spring Batch 作业, ItemProcessor和 ItemWriter . XML 如下所示,
我有一个从数据库读取的多线程批处理作业,我担心不同的线程会重新读取记录,因为 ItemReader 在 Spring 批处理中不是线程安全的。我经历了SpringBatch FAQ部分指出 You c
当我尝试读取 csv 文件时,Spring 批处理遇到了这个问题。 我必须读取具有如下结构的CSV: valueHeader;valueHeader;valueHeader;valueHeader;v
我有一个 Spring Batch 项目,其中有 JsonResouurceAsyncPagingItemReader,这是一个自定义 ItemReader,它从 Web 服务异步检索数据。 此自定义
我是一名优秀的程序员,十分优秀!