开发手册 欢迎您!
软件开发者资料库

Spring Boot - 批量服务

Spring Boot Batch Service - 从基本到高级概念的简单简单步骤学习Spring Boot,其中包括简介,快速入门,Bootstrapping,Tomcat部署,构建系统,代码结构,Spring Bean和依赖注入,Runners,应用程序属性,日志记录等示例,构建RESTful Web服务,异常处理,拦截器,Servlet过滤器,Tomcat端口号,Rest模板,文件处理,服务组件,Thymeleaf,使用RESTful Web服务,CORS支持,国际化,调度,启用HTTPS,Eureka服务器,服务注册Eureka,Zuul代理服务器和路由,Spring云配置服务器,Spring云配置客户端,执行器,管理服务器,管理客户端,启用Swagger2,创建Docker镜像,跟踪微服务日志,Flyway数据库,发送电子邮件,Hystrix,Web套接字,批处理服务,Apache Kafka的Spring,Twilio,单元测试用例,静态控制器单元测试,数据库处理,Web安全应用程序,带有JWT的OAuth2,Google云平台,Google OAuth2登录。

您可以创建一个可执行的JAR文件,并使用Maven或Gradle命令运行Spring Boot应用程序,如下所示 :

对于Maven,您可以使用下面给出的命令 :

mvn clean install


"BUILD SUCCESS"之后,你可以在目标目录下找到JAR文件.

对于Gradle,你可以使用如下所示的命令 :

gradle clean build


在"BUILD SUCCESSFUL"之后,你可以在build/libs目录下找到JAR文件.

使用此处给出的命令运行JAR文件 :

java -jar 


现在,应用程序已在Tomcat端口8080上启动,如图所示.

批处理服务应用程序在Tomcat端口上启动

现在,在网络中点击URL http://localhost:8080/浏览器并连接Web套接字并发送问候语并接收消息.

Web Socket发送和接收消息

批处理服务是在单个任务中执行多个命令的过程.在本章中,您将学习如何在Spring Boot应用程序中创建批处理服务.

让我们考虑一个示例,我们将CSV文件内容保存到HSQLDB中.

要创建批处理服务程序,我们需要在构建配置文件中添加Spring Boot Starter Batch依赖项和HSQLDB依赖项.

Maven用户可以在pom.xml文件中添加以下依赖项.

   org.springframework.boot   spring-boot-starter-batch   org.hsqldb   hsqldb


Gradle用户可以在build.gradle文件中添加以下依赖项.

compile("org.springframework.boot:spring-boot-starter-batch")compile("org.hsqldb:hsqldb")


现在,在classpath resources  -  src/main/resources下添加简单的CSV数据文件,并将文件命名为file.csv,如下所示 :

William,JohnMike, SebastianLawarance, Lime


接下来,在类路径资源下编写HSQLDB的SQL脚本目录 -   request_fail_hystrix_timeout

DROP TABLE USERS IF EXISTS;CREATE TABLE USERS  (   user_id BIGINT IDENTITY NOT NULL PRIMARY KEY,   first_name VARCHAR(20),   last_name VARCHAR(20));


为USERS模型创建一个POJO类,如下所示 :

package com.it1352.batchservicedemo;public class User {   private String lastName;   private String firstName;   public User() {   }   public User(String firstName, String lastName) {      this.firstName = firstName;      this.lastName = lastName;   }   public void setFirstName(String firstName) {      this.firstName = firstName;   }   public String getFirstName() {      return firstName;   }   public String getLastName() {      return lastName;   }   public void setLastName(String lastName) {      this.lastName = lastName;   }   @Override   public String toString() {      return "firstName: " + firstName + ", lastName: " + lastName;   }   }


现在,创建一个中间处理器,在从CSV文件读取数据之后和写入之前执行操作将数据导入SQL.

package com.it1352.batchservicedemo; import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.batch.item.ItemProcessor;public class UserItemProcessor implements ItemProcessor {   private static final Logger log = LoggerFactory.getLogger(UserItemProcessor.class);   @Override   public User process(final User user) throws Exception {      final String firstName = user.getFirstName().toUpperCase();      final String lastName = user.getLastName().toUpperCase();      final User transformedPerson = new User(firstName, lastName);      log.info("Converting (" + user + ") into (" + transformedPerson + ")");      return transformedPerson;   }}


让我们创建一个Batch配置文件,从CSV读取数据并写入SQL文件,如图所示下面.我们需要在配置类文件中添加@EnableBatchProcessing注释. @EnableBatchProcessing注释用于启用Spring Boot应用程序的批处理操作.

package com.it1352.batchservicedemo; import javax.sql.DataSource;import org.springframework.batch.core.Job;import org.springframework.batch.core.Step;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;import org.springframework.batch.core.launch.support.RunIdIncrementer;import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider;import org.springframework.batch.item.database.JdbcBatchItemWriter;import org.springframework.batch.item.file.FlatFileItemReader;import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;import org.springframework.batch.item.file.mapping.DefaultLineMapper;import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;@Configuration@EnableBatchProcessingpublic class BatchConfiguration {   @Autowired   public JobBuilderFactory jobBuilderFactory;   @Autowired   public StepBuilderFactory stepBuilderFactory;   @Autowired   public DataSource dataSource;   @Bean   public FlatFileItemReader reader() {      FlatFileItemReader reader = new FlatFileItemReader();      reader.setResource(new ClassPathResource("file.csv"));      reader.setLineMapper(new DefaultLineMapper() {         {            setLineTokenizer(new DelimitedLineTokenizer() {               {                  setNames(new String[] { "firstName", "lastName" });               }            });            setFieldSetMapper(new BeanWrapperFieldSetMapper() {               {                  setTargetType(User.class);               }            });         }      });      return reader;   }   @Bean   public UserItemProcessor processor() {      return new UserItemProcessor();   }   @Bean   public JdbcBatchItemWriter writer() {      JdbcBatchItemWriter writer = new JdbcBatchItemWriter();      writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider());      writer.setSql("INSERT INTO USERS (first_name, last_name) VALUES (:firstName, :lastName)");      writer.setDataSource(dataSource);      return writer;   }   @Bean   public Job importUserJob(JobCompletionNotificationListener listener) {      return jobBuilderFactory.get("importUserJob").incrementer(         new RunIdIncrementer()).listener(listener).flow(step1()).end().build();   }   @Bean   public Step step1() {      return stepBuilderFactory.get("step1").chunk(10).reader(reader()).processor(processor()).writer(writer()).build();   }}


reader()方法用于从CSV文件中读取数据和writer()方法用于将数据写入SQL.

接下来,我们将编写一个Job Completion Notification Listener类 - 用于在作业完成后通知.

  package com.it1352.batchservicedemo;  import java.sql.ResultSet;  import java.sql.SQLException;  import java.util.List;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  import org.springframework.batch.core.BatchStatus;  import org.springframework.batch.core.JobExecution;  import org.springframework.batch.core.listener.JobExecutionListenerSupport;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.jdbc.core.JdbcTemplate;  import org.springframework.jdbc.core.RowMapper;  import org.springframework.stereotype.Component;  @Component 公共类JobCompletionNotificationListener扩展JobExecutionListenerSupport { private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);  private final JdbcTemplate jdbcTemplate;  @Autowired  public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate){ this.jdbcTemplate = jdbcTemplate; }  @Override  public void afterJob(JobExecution jobExecution){ if(jobExecution.getStatus()== BatchStatus.COMPLETED){ log.info(" !!!工作结束!!是时候验证结果!!"); 列表<用户> results = jdbcTemplate.query("SELECT first_name,last_name FROM USERS",new RowMapper< User>(){ @Override  public User mapRow(ResultSet rs,int row抛出SQLException {返回新用户(rs.getString(1),rs.getString(2)); } }); (用户人:结果){ log.info("在数据库中找到<"+ person +">"); } } } }


现在,创建一个可执行的JAR文件,然后运行Spring使用以下Maven或Gradle命令启动应用程序.

对于Maven,使用如下所示的命令 :

  mvn clean install


在"BUILD SUCCESS"之后,您可以在目标目录下找到JAR文件.

对于Gradle,您可以使用如下所示的命令 :

  gradle clean build


在"BUILD SUCCESSFUL"之后,您可以在build/libs目录下找到JAR文件.

使用此处给出的命令运行JAR文件 :

  java -jar< JARFILE>


您可以在控制台窗口中看到输出显示 :

控制台窗口中的批处理服务输出