其中一个核心组件就是ItemWriter,它是用于处理批处理结果的组件之一。ItemWriter的概念在Spring Batch中,ItemWriter是用于处理批处理结果的组件。 下面是ItemWriter接口的定义:public interface ItemWriter<T> { void write(List<? ItemWriter的实现方式Spring Batch提供了许多预定义的ItemWriter实现,以便开发人员快速创建ItemWriter。 除了预定义的ItemWriter实现之外,我们还可以通过实现ItemWriter接口来创建自定义的ItemWriter。 ItemWriter的使用示例在使用ItemWriter时,我们通常会将其与ItemReader和ItemProcessor组合使用,以实现一个完整的批处理任务。
()); itemWriter.afterPropertiesSet(); return itemWriter; } } public class MyCustomerLineAggregator (new FileSystemResource(path)); itemWriter.afterPropertiesSet(); return itemWriter; (new FileSystemResource(path)); itemWriter.afterPropertiesSet(); return itemWriter; ); itemWriter.afterPropertiesSet(); return itemWriter; } CompositeItemWriter (),jsonFileWriter())); itemWriter.afterPropertiesSet(); return itemWriter; } ```
2、ItemWriter ItemWriter在功能上类似于ItemReader,但具有反向操作。资源仍然需要定位、打开和关闭,但它们的不同之处在于ItemWriter是写入,而不是读取。 如下所示,是ItemWriter接口的定义: public interface ItemWriter<T> { void write(List<? 3、ItemStream itemreader和itemwriter都很好地满足了各自的目的,但它们之间存在一个共同的问题,需要另一个接口。 类似的限制也适用于实现ItemStream的ItemWriter。 如果在ExecutionContext中找到了预期的数据,那么可以使用它在初始状态以外的位置启动ItemReader或ItemWriter。
StepStep是Spring Batch中的一个处理步骤,它包含了一个ItemReader、一个ItemProcessor和一个ItemWriter。 ItemReader用于读取数据,ItemProcessor用于处理数据,ItemWriter用于写入数据。 ItemProcessorItemProcessor用于处理数据,它可以对读取到的数据进行处理,并将处理后的数据传递给ItemWriter进行写入。 创建ItemWriter最后,我们需要创建ItemWriter。在这个例子中,我们将使用JdbcBatchItemWriter将处理后的User对象写回到数据库中。 同时,我们还需要创建Job、Step、ItemReader、ItemProcessor和ItemWriter,并使用JobLauncher来运行Job。
@Autowired private ItemProcessor<MyObject, MyObject> itemProcessor; @Autowired private ItemWriter <MyObject> itemWriter; @Bean public Step myStep() { return stepBuilderFactory.get("myStep .reader(itemReader) .processor(itemProcessor) .writer(itemWriter stepBuilderFactory创建了一个名为myStep的Step,并使用chunk方法定义了一个Chunk-oriented任务,并在其中引用了itemReader、itemProcessor和itemWriter
itemProcessor() { return new MyItemProcessor(); } @Bean public FlatFileItemWriter<MyObject> itemWriter .reader(itemReader()) .processor(itemProcessor()) .writer(itemWriter 在itemReader、itemProcessor和itemWriter方法中,我们使用@Bean注解定义了三个组件,并设置了它们的属性。 BeanWrapperFieldSetMapper、DelimitedLineAggregator和BeanWrapperFieldExtractor等类来定义ItemReader、ItemProcessor和ItemWriter stepBuilderFactory创建了一个名为myStep的Step,并使用chunk方法定义了一个Chunk-oriented任务,并在其中引用了itemReader、itemProcessor和itemWriter
FlatFileItemWriter<Customer> flatFileDemoFlatFileWriter() throws Exception { FlatFileItemWriter<Customer> itemWriter ",".data").getAbsolutePath(); System.out.println(">> file is created in: " + path); itemWriter.setResource (new FileSystemResource(path)); itemWriter.setLineAggregator(new MyCustomerLineAggregator() ); itemWriter.afterPropertiesSet(); return itemWriter; } 具体ItemProcessor实现 @Component
处理后的数据将被传递给ItemWriter。 ItemWriter:负责将数据写入目标系统。它接收从ItemProcessor传递过来的数据,并将其写入指定的数据存储或系统中。 编写自定义的读写器和处理器:根据数据源和目标系统的特性,编写自定义的ItemReader、ItemProcessor和ItemWriter实现。 这个案例涵盖了Spring Batch的大部分核心概念,包括Job、Step、ItemReader、ItemProcessor和ItemWriter。 ,将处理后的数据写入到target_table表中 @Bean public ItemWriter<MyData> itemWriter(DataSource dataSource) { 接着,我们定义了ItemReader、ItemProcessor和ItemWriter,分别用于读取数据、处理数据和写入数据。
<batch:tasklet> <batch:chunk reader="itemReader" processor="itemProcessor" writer="<em>itemWriter</em> property> </bean> <bean id="itemProcessor" class="com.example.MyItemProcessor" /> <bean id="<em>itemWriter</em> 在myStep中,我们使用tasklet标签定义了一个Chunk-oriented任务,并在其中引用了一个ItemReader、一个ItemProcessor和一个<em>ItemWriter</em>,并设置了commit-interval 在ItemReader和<em>ItemWriter</em>的定义中,我们分别使用FlatFileItemReader和FlatFileItemWriter,并指定了相应的输入和输出文件。 在<em>ItemWriter</em>中,我们使用DelimitedLineAggregator和BeanWrapperFieldExtractor来将输出对象转换为一行文本。
一、核心概念任务的输入和输出Step的输入和输出分别对应着ItemReader和ItemWriter,它们分别用来读取输入数据和输出处理结果。 在一个Step中,输入和输出的数据类型通常是一致的,也就是说,ItemReader和ItemWriter所处理的对象类型是相同的。 ItemProcessor负责对输入数据进行处理,并将处理结果传递给ItemWriter。在处理逻辑中,我们可以对输入数据进行过滤、排序、计算等操作,以生成输出结果。 StepBuilderFactory提供了多个方法来设置Step的属性,包括Step名称、ItemReader、ItemProcessor、ItemWriter、Chunk大小、Skip策略等等。
Writer Writer通过ItemWriter接口实现: public interface ItemWriter<T> { void write(List<? 可以使用组合模式来实现这个目的: public class CompositeItemWriter<T> implements ItemWriter<T> { ItemWriter<T> itemWriter ; public CompositeItemWriter(ItemWriter<T> itemWriter) { this.itemWriter = itemWriter; extends T> items) throws Exception { //Add business logic here itemWriter.write(items) ; } public void setDelegate(ItemWriter<T> itemWriter){ this.itemWriter = itemWriter;
ItemWriter(数据写入器):ItemWriter用于将处理后的数据写回到目标数据源或文件。 配置ItemReader、ItemProcessor、和ItemWriter: 在Step的定义中,配置ItemReader用于读取数据,ItemProcessor用于处理数据,ItemWriter用于写入数据 ItemWriter(数据写入器) ItemWriter用于将处理后的数据写入目标存储,这可以是数据库、文件、消息队列等。 和ItemReader一样,Spring Batch提供了多种ItemWriter的实现,也支持自定义ItemWriter。 下面是一个Step的配置示例,将ItemReader和ItemWriter组合在一起: @Bean public Step myStep(ItemReader<MyData> reader, ItemWriter
1.2 ItemWriter ItemWriter 在功能上类似于 ItemReader,但属于相反的操作。 示例如下: public class CompositeItemWriter<T> implements ItemWriter<T> { ItemWriter<T> itemWriter; public CompositeItemWriter(ItemWriter<T> itemWriter) { this.itemWriter = itemWriter; } public void write(List 此处可以执行某些业务逻辑 itemWriter.write(item); } public void setDelegate(ItemWriter<T> itemWriter){ this.itemWriter = itemWriter; } } 上面的类中包含了另一个ItemWriter引用,通过代理它来实现某些业务逻辑。
我们还指定了ItemReader、ItemProcessor和ItemWriter,它们分别用于读取数据、处理数据和写入数据。 创建ItemProcessor和ItemWriter最后,我们需要创建一个ItemProcessor和一个ItemWriter,用于处理数据并将其写入目标数据源。 然后,我们将使用一个简单的ItemWriter,它用于将处理后的Person对象输出到控制台。 processor() { return person -> new Person(person.getName().toUpperCase(), person.getAge());}@Beanpublic ItemWriter 在ItemWriter中,我们将处理后的Person对象输出到控制台。运行批处理任务现在,我们已经准备好了批处理任务的所有组件。
多文本输出 Spring Batch输出数据通过 ItemWriter接口的实现类来完成,包括 FlatFileItemWriter文本数据输出、 StaxEventItemWriter XML 框架搭建 新建一个Spring Boot项目,版本为2.2.4.RELEASE,artifactId为spring-batch-itemwriter 剩下的数据库层的准备,项目配置,依赖引入和Spring <TestData> dataSourceItemWriter() { // ItemWriter的实现类之一,mysql数据库数据写入使用JdbcBatchItemWriter, writer = new ClassifierCompositeItemWriter<>(); writer.setClassifier((Classifier<TestData, ItemWriter 输出数据,此外在Step中,还需通过StepBuilderFactory的stream()方法传入使用到的ItemWriter(这里需要注意的是,注入的时候,类型应选择ItemStreamWriter)
PersonItemProcessor(); } @Bean MongoItemWriter<Person> writer(){ MongoItemWriter<Person> itemWriter = new MongoItemWriter<Person>(); itemWriter.setTemplate(mongoTemplate); itemWriter.setCollection ("branch"); return itemWriter; } @Bean public Step step() { return stepBuilderFactory.get
StepBuilderFactory stepBuilderFactory;
@Autowired
@Qualifier("dbJdbcDemoWriter")
private ItemWriter reader;
}
}
输出方法 ``` @Component("dbJdbcDemoWriter") public class DbJdbcDemoWriter implements ItemWriter private StepBuilderFactory stepBuilderFactory;
@Autowired
@Qualifier("flatFileDemoWriter")
private ItemWriter reader;
}
}
输出方法
@Component(“flatFileDemoWriter”)
public class FlatFileDemoWriter implements ItemWriter private StepBuilderFactory stepBuilderFactory;
@Autowired
@Qualifier("multiFileDeWriter")
private ItemWriter
spring.batch.initialize-schema=always 创建批处理任务 一个典型的Spring Batch任务包括三个主要部分:ItemReader、ItemProcessor和ItemWriter ItemWriter:写数据的接口。 firstName); transformedPerson.setLastName(lastName); return transformedPerson; } } 创建ItemWriter 例如: 多步骤批处理:一个Job可以包含多个Step,每个Step可以有不同的ItemReader、ItemProcessor和ItemWriter。 从项目初始化、配置Spring Batch、实现ItemReader、ItemProcessor和ItemWriter,到配置Job和Step,Spring Batch提供了一系列强大的工具和框架,帮助开发者高效地实现批处理任务
this.workerBuilder .itemProcessor(itemProcessor()) .itemWriter (itemWriter()) .inputChannel(incomingRequestsFromMaster()) .reader(itemReader()) .processor(itemProcessor()) .writer(itemWriter
}}); return reader;}在这个示例中,我们创建了一个名为“reader”的FlatFileItemReader,它从一个名为“persons.csv”的CSV文件中读取数据创建ItemWriter 接下来,我们需要创建一个用来写入数据到数据库的ItemWriter,这里我们使用JdbcBatchItemWriter来写入数据。 在创建Step时,我们需要指定ItemReader、ItemProcessor、ItemWriter等属性。 在“step1”中,我们使用了chunk()方法来指定每次读取和处理的数据条数,同时指定了ItemReader、ItemProcessor和ItemWriter。