SpringBoot批处理的实现示例

下面是“SpringBoot批处理的实现示例”的完整攻略。

什么是SpringBoot批处理

Spring Batch是Spring框架中的一个模块,用于大批量数据的处理,可以非常方便地实现数据的读取、处理和输出。SpringBoot批处理是使用Spring Batch模块实现的批处理应用。

如何使用SpringBoot批处理

步骤1:引入Spring Batch依赖

pom.xml文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
</dependencies>

步骤2:编写Job

在Spring Boot中,Job是基于Spring Batch的一个特殊组件。

创建一个Job非常容易,只需要创建一个类来对作业进行定义并编写步骤(Step):

@Configuration
public class JobConfiguration {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .tasklet((stepContribution, chunkContext) -> {
                    System.out.println("Hello, world!");
                    return RepeatStatus.FINISHED;
                }).build();
    }

    @Bean
    public Job helloWorldJob() {
        return jobBuilderFactory.get("helloWorldJob")
                .start(step1())
                .build();
    }
}

以上例子创建了一个名为helloWorldJob的Job,并定义了一个名为step1的步骤,每次执行打印一行Hello, world!的消息。

步骤3:运行Job

Spring Boot提供了一种非常便利的方式来启动Job,只需要使用JobLauncher接口即可执行指定的Job:

@RestController
public class JobLauncherController {

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private Job job;

    @GetMapping("/run-job")
    public String runJob() throws Exception {
        JobParameters jobParameters = new JobParametersBuilder()
                .addString("JobID", String.valueOf(System.currentTimeMillis()))
                .toJobParameters();
        jobLauncher.run(job, jobParameters);
        return "Job executed successfully!";
    }

}

在这里,我们使用了@RestController注解创建一个RESTful接口/run-job,接口的实现代码里我们调用了jobLauncher.run来启动helloWorldJob,并使用JobParameters对象来传递参数。

完整示例

下面提供两个完整示例:

示例一:读取CSV文件内容并输出到日志

@Configuration
@EnableBatchProcessing
public class CsvFileToLogJobConfiguration {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public FlatFileItemReader<Customer> customerItemReader() {
        return new FlatFileItemReaderBuilder<Customer>()
                .name("customerItemReader")
                .resource(new ClassPathResource("customer.csv"))
                .delimited().names(new String[]{"firstName", "lastName"})
                .targetType(Customer.class)
                .build();
    }

    @Bean
    public ItemWriter<Customer> customerItemWriter() {
        return (items) -> {
            for (Customer customer : items) {
                System.out.println(customer);
            }
        };
    }

    @Bean
     public Step csvFileToLogStep() {
        return stepBuilderFactory.get("csvFileToLogStep")
                .<Customer, Customer>chunk(100)
                .reader(customerItemReader())
                .writer(customerItemWriter())
                .build();
    }

    @Bean
    public Job csvFileToLogJob() {
        return jobBuilderFactory.get("csvFileToLogJob")
                .start(csvFileToLogStep())
                .build();
    }
}

@AllArgsConstructor
@NoArgsConstructor
@Data
class Customer {
    private String firstName;
    private String lastName;
}

以上代码示例读取名为customer.csv的文件内容,并按照"firstName"和"lastName"两个字段分别对应一个Customer对象。读取到的Customer对象会在customerItemWriter中被打印到控制台。执行该代码后,在控制台可以看到从CSV文件中读取的记录输出的日志信息。

示例二:使用SpringBatch写入数据到数据库

@Configuration
@EnableBatchProcessing
public class CsvToDatabaseJobConfiguration {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private DataSource dataSource;

    @Bean
    public FlatFileItemReader<Customer> customerItemReader() {
        return new FlatFileItemReaderBuilder<Customer>()
                .name("customerItemReader")
                .resource(new ClassPathResource("customer.csv"))
                .delimited().names(new String[]{"firstName", "lastName"})
                .targetType(Customer.class)
                .build();
    }

    @Bean
    public ItemWriter<Customer> customerItemWriter() {
        JdbcBatchItemWriter<Customer> writer = new JdbcBatchItemWriter<>();
        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        writer.setSql("INSERT INTO customer (first_name, last_name) " +
                "VALUES (:firstName, :lastName)");
        writer.setDataSource(dataSource);
        return writer;
    }

    @Bean
    public Step csvToDatabaseStep() {
        return stepBuilderFactory.get("csvToDatabaseStep")
                .<Customer, Customer>chunk(100)
                .reader(customerItemReader())
                .writer(customerItemWriter())
                .build();
    }

    @Bean
    public Job csvToDatabaseJob() {
        return jobBuilderFactory.get("csvToDatabaseJob")
                .start(csvToDatabaseStep())
                .build();
    }
}

以上代码示例读取名为customer.csv的文件内容,并将其写入到数据库中的customer表。执行该代码后,可以在对应的表中看到文件内容被写入数据库的记录。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot批处理的实现示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JDK源码分析之String、StringBuilder和StringBuffer

    JDK源码分析之String、StringBuilder和StringBuffer 什么是String、StringBuilder和StringBuffer String是Java中的一个不可变字符序列,使用final char[] value来存储数据,也就是说,一旦被初始化,就不能再对其进行修改。 StringBuilder和StringBuffer实现…

    Java 2023年5月26日
    00
  • Java中System.currentTimeMillis()计算方式与时间单位转换讲解

    下面是Java中System.currentTimeMillis()计算方式与时间单位转换讲解的完整攻略。 1. System.currentTimeMillis()计算方式 在Java中,我们可以通过System.currentTimeMillis()方法获取当前的毫秒数,这个毫秒数表示从1970年1月1日00:00:00 GMT起到现在的时间间隔。 这个…

    Java 2023年5月20日
    00
  • 什么是即时编译(AOT)?

    即时编译(AOT)是指在程序运行前将源代码编译成机器码。不同于传统的预编译,AOT编译是在程序运行前进行编译的,可以将程序的执行效率提高。 下面是AOT的完整使用攻略: 1. AOT的原理 AOT编译是将程序源代码在编译时生成机器码。在程序运行时,不需要再进行编译,可以直接运行机器码,从而提高程序的运行效率。 2. AOT的使用方式 AOT编译在不同语言和平…

    Java 2023年5月11日
    00
  • Java文件操作之按行读取文件和遍历目录的方法

    针对“Java文件操作之按行读取文件和遍历目录的方法”,我为您提供以下攻略: 一、按行读取文件 1. BufferedReader按行读取 要按行读取文件,可以借助BufferedReader类。具体实现步骤如下: 创建文件,例如我们要读取的文件名为test.txt,存放在D:\test目录下,则创建文件实例代码如下: java File file = ne…

    Java 2023年5月19日
    00
  • 浅谈Hibernate中的三种数据状态(临时、持久、游离)

    在Hibernate中,有三种数据状态:临时(Transient)、持久(Persistent)和游离(Detached)。对于开发者来说,理解这三种状态对于Hibernate的使用非常重要。 临时状态(Transient) 当一个Java对象被创建,但没有与Hibernate Session建立关系时,它处于临时状态。临时对象通常不会保存到数据库中,因为它…

    Java 2023年5月19日
    00
  • java导出Excel通用方法的实例详解

    Java导出Excel通用方法的实例详解 1. 什么是Java导出Excel通用方法? Java导出Excel通用方法指的是使用Java编写代码来生成Excel文件,是一种常见的数据导出方式。Java导出Excel通用方法主要使用Apache POI库实现,可以生成各种格式的Excel文件。使用Java导出Excel通用方法可以将数据以表格的形式展示,并且可…

    Java 2023年6月2日
    00
  • spring data JPA 中的多属性排序方式

    标题:spring data JPA 中的多属性排序方式 简介 Spring Data JPA是Spring框架中访问JPA数据的一个模块。它提供一种方便的方式来持久化数据,同时也提供了许多有用的特性,其中之一就是排序。常见的排序方式包括按照单个属性排序,但在某些情况下我们需要按照多个属性来排序。在本篇文章中,我将介绍如何使用Spring Data JPA中…

    Java 2023年5月20日
    00
  • Java mysql数据库并进行内容查询实例代码

    下面是详细讲解Java连接MySQL数据库并进行内容查询的完整攻略: 前置条件 Java编程环境已经安装并配置好; MySQL数据库已经安装并设置好用户名和密码; MySQL JDBC驱动程序已经下载,并在项目中添加了相关jar包。 连接MySQL数据库 首先,我们需要在Java代码中连接MySQL数据库。这可以通过以下代码完成: import java.s…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部