spring boot(学习笔记第十九课)

spring boot(学习笔记第十九课)

  • Spring boot的batch框架,以及Swagger3(OpenAPI)整合

学习内容:

  • Spring boot的batch框架
  • Spring boot的Swagger3(OpenAPI)整合

1. Spring boot batch框架

  1. Spring Batch是什么
    • Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。
      • Spring Batch的执行流程主要包括以下几个步骤:
        • 配置JobLaunch
        • 配置Job
        • 配置Step
        • 配置ItemReader来读取数据
        • 配置ItemProcessor来处理数据
        • 配置ItemWriter来写数据
        • 配置JobRepository来管理作业状态
        • 创建并运行作业
  2. 练习使用Spring Batch
    • Spring Batch Guide(可以参照最新的官方guide)

    • 加入必要的依赖(这里使用jdbc连接mysql数据库)

      xml 复制代码
        <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
                  <version>8.0.33</version>
        </dependency>
        <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
    • Spring Batch会创建出自己管理的表,所以要执行sql进行创建。

      • sql都已经准备在导入的依赖中准备好了。

        properties 复制代码
        spring.batch.jdbc.schema=classpath:/org/springframework/batch/core/schema-mysql.sql


        将上面的sql拷贝出来,在msql数据库中执行。

    • 配置application.properties进行数据库设置。
      本来spring.batch.jdbc.initialize-schema=always能够进行自动创建Spring Batch需要的table,但是没有成功,手动创建了。

      java 复制代码
      spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      spring.datasource.username=finlay
      spring.datasource.password=123456
      spring.batch.jdbc.initialize-schema=always
      spring.batch.jdbc.table-prefix=BATCH_
      spring.batch.jdbc.schema=classpath:/org/springframework/batch/core/schema-mysql.sql
      spring.batch.job.enabled=false
    • 准备数据文件data.csv
      注意,接下来要在后面的代码中,load csv文件的时候,(new ClassPathResource("data.csv"))ClassPath中取得,所以事先放在/resources这个ClassPath的直下。

    • 准备Userentity类。

      java 复制代码
      @Data
      public class User {
          private Integer id;
          private String name;
          private String address;
          private String gender;
      }
    • 准备CsvBatchJobConfig类,配置Spring BatchJob

      java 复制代码
      @Configuration
      public class CsvBatchJobConfig {
      
          @Bean
          FlatFileItemReader<User> itemReader() {
              FlatFileItemReader<User> reader =
                      new FlatFileItemReader<User>();
              reader.setLinesToSkip(1);
              reader.setResource(new ClassPathResource("data.csv"));
              reader.setLineMapper(new DefaultLineMapper<>() {
                  {
                      setLineTokenizer(new DelimitedLineTokenizer() {
                          {
                              setNames("id", "name", "address", "gender");
                              setDelimiter("\t");
                          }
                      });
                      setFieldSetMapper(new BeanWrapperFieldSetMapper<>() {
                          {
                              setTargetType(User.class);
                          }
                      });
                  }
              });
              return reader;
          }
      
          @Bean
          public JdbcBatchItemWriter<User> jdbcBatchItemWriter(DataSource dataSource) {
              return new JdbcBatchItemWriterBuilder<User>()
                      .sql("insert into user(id,name,address,gender)" +
                              "values(:id,:name,:address,:gender)")
                      .dataSource(dataSource)
                      .beanMapped()
                      .build();
          }
      
          @Bean
          public Step csvStep(JobRepository jobRepository,
                              DataSourceTransactionManager transactionManager,
                              FlatFileItemReader<User> flatFileItemReader,
                              JdbcBatchItemWriter<User> jdbcBatchItemWriter) {
              SimpleStepBuilder<User, User> stepBuilder =
                      new StepBuilder("csvStep", jobRepository)
                              .<User, User>chunk(10, transactionManager)
                              .reader(flatFileItemReader)
                              .writer(jdbcBatchItemWriter);
              return stepBuilder.build();
          }
      
          @Bean
          public Job csvJob(JobRepository jobRepository,
                            Step csvStep) {
              return new JobBuilder("csvJob", jobRepository)
                      .start(csvStep)
                      .build();
          }
      }
    • Spring Boot的主类中@EnableBatchProcessing(databaseType = "mysql")

      java 复制代码
      @SpringBootApplication
      @EnableBatchProcessing(databaseType = "mysql")
      public class DemoApplication {
      
      	public static void main(String[] args) {
      		SpringApplication.run(DemoApplication.class, args);
      	}
      
      	@Bean
      	Queue queue(){
      		return new ActiveMQQueue("amq");
      	}
      }
    • 定义BatchController,进行调用JobLauncher

      java 复制代码
      @Controller
      public class BatchController {
          @Autowired
          public JobLauncher jobLauncher;
      
          @Autowired
          Job csvJob;
      
          @GetMapping("csv_import")
          @ResponseBody
          public String csvImport() {
              String result;
              try {
                  jobLauncher.run(csvJob,
                          new JobParametersBuilder().toJobParameters());
                  result = "csv job ok";
              } catch (Exception e) {
                  e.printStackTrace();
                  result = "csv job ng";
              }
              return result;
          }
      }
    • 定义User目标表在mysql

      sql 复制代码
      CREATE TABLE `USER` (
        `id` int(11) NOT NULL,
        `name` varchar(255) NOT NULL,
        `address` varchar(255) NOT NULL,
        `gender` varchar(255) DEFAULT NULL,
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    • 启动Spring Boot应用程序,访问BatchController

    • 检查mysql数据库的User表。

      可以看到数据都已经导入进去了。

2. Spring boot的Swagger3整合

前后端分离,一般采用Swagger3 ,将RESTful API文档和代码结合在一起。这样在维护代码的时候,自然生成最新的RESTful API文档。
这里最新的Spring Boot不支持Swagger2,可以使用Swagger3 OpenAPI

  1. 在项目中导入Swagger3

    • 导入需要的依赖。

      xml 复制代码
              <dependency>
                  <groupId>org.springdoc</groupId>
                  <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
                  <version>2.6.0</version>
              </dependency>
    • 配置springdoc-openapi Swagger3

      java 复制代码
      @Configuration
      public class Swagger3Config {
          @Bean
          OpenAPI openAPI() {
              return new OpenAPI()
                      .info(new Info()
                              .title("项目接口API文档")
                              .description("项目接口API文档")
                              .version("v0.1")
                              .license(new License().name("Apache2.0").url("http://springdoc.org")))
                      .externalDocs(new ExternalDocumentation()
                              .description("SpringShop Wiki Documentation")
                              .url("https://springshop.wiki.github.org/docs"));
          }
      }
    • application.properties中限定生成springdocpackage

      properties 复制代码
      springdoc.packagesToScan=com.example.demo.controller.swagger
    • 定义自己项目的controller

      java 复制代码
      @RestController
      public class Swagger3Controller {
          @Operation(summary = "查询用户", description = "根据Id查询用户")
          @Parameter(in = ParameterIn.PATH, name = "id", description= "用户Id", required = true)
          @GetMapping("/user/{id}")
          public String getUserById(@PathVariable Integer id) {
              return "/user/" + id;
          }
      
          @ApiResponses({
                  @ApiResponse(responseCode= "200", description= "删除成功"),
                  @ApiResponse(responseCode= "500", description= "删除失败")
          })
          @Operation(summary= "删除用户", description= "通过Id删除用户")
          @DeleteMapping("/user/{id}")
          public Integer deleteUserById(@PathVariable Integer id) {
              return id;
          }
      
          @Operation(summary = "添加用户", description = "添加一个用户,传入用户名和地址")
          @Parameters({
                  @Parameter(in = ParameterIn.QUERY,
                          name = "username",
                          description = "用户名",
                          required = true),
                  @Parameter(in = ParameterIn.QUERY,
                          name = "address",
                          description= "地址",
                          required = true)
          })
          @PostMapping("/user")
          public String addUser(@RequestParam String username,
                                @RequestParam String address) {
              return username + address;
          }
      
          @Operation(summary = "修改用户", description = "修改用户,传入用户信息")
          @PutMapping("/user")
          public String updateUser(@RequestBody User user) {
              return user.toString();
          }
      
          @Hidden
          @GetMapping("/ignore")
          public String ignoreMethod() {
              return "ignored method";
          }
      }

    访问swagger ui的链接 http://localhost:8080/swagger-ui/index.html

相关推荐
用户9083246027313 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
齐生113 小时前
iOS 知识点 - IAP 是怎样的?
笔记
tingshuo29171 天前
D006 【模板】并查集
笔记
用户8307196840821 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解1 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解1 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记2 天前
Spring Boot Web MVC配置详解
spring boot·后端
tingshuo29172 天前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
初次攀爬者2 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840822 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp