• spring batch 学习 简单demo


    以下是关于spring batch 简单学习环境,基于starter 生成代码

    maven 项目

    • pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.5.3</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.dalong</groupId>
        <artifactId>batchapp</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>batchapp</name>
        <description>mybatch app</description>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-batch</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
     
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>1.3.156</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.batch</groupId>
                <artifactId>spring-batch-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
     
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
     
    </project>
     
    • tasklet 定义
    package com.dalong.batchapp;
     
    import org.springframework.batch.core.StepContribution;
    import org.springframework.batch.core.scope.context.ChunkContext;
    import org.springframework.batch.core.step.tasklet.Tasklet;
    import org.springframework.batch.repeat.RepeatStatus;
     
    public class DemoTaskLet implements Tasklet {
        @Override
        public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
            System.out.println("demo");
            return RepeatStatus.FINISHED;
        }
    }
     
    • Job 以及step bean
    package com.dalong.batchapp;
     
    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.job.SimpleJob;
    import org.springframework.batch.core.step.tasklet.TaskletStep;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
     
     
    @EnableBatchProcessing
    @SpringBootApplication
    public class BatchappApplication {
     
        @Autowired
        JobBuilderFactory jobBuilderFactory;
     
        @Autowired
        StepBuilderFactory stepBuilderFactory;
     
        public static void main(String[] args) {
            SpringApplication.run(BatchappApplication.class, args);
        }
     
        @Bean
        public DemoTaskLet demoTaskLet(){
            return new DemoTaskLet();
        }
        @Bean
     
        public Job myjob(){
            Step step = this.stepBuilderFactory.get("login").tasklet(demoTaskLet()).build();
            return this.jobBuilderFactory.get("mydemo").start(step).build();
        }
     
    }
     

    运行效果

    rest api 调用

    • rest 定义
    package com.dalong.batchapp;
     
     
    import org.springframework.batch.core.*;
    import org.springframework.batch.core.launch.JobLauncher;
    import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
    import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
    import org.springframework.batch.core.repository.JobRestartException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
     
    @RestController
    public class ApiController {
        @Autowired
        JobLauncher jobLauncher;
        @Autowired
        Job myjob;
        @GetMapping(value = {"/demo"})
        public void runJob() throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
            Map<String, JobParameter> context = new HashMap<>();
            //  确保每次都创建新的jobinstance
            context.put("id", new JobParameter(UUID.randomUUID().toString()));
            JobExecution jobExecution= jobLauncher.run(myjob,new JobParameters(context));
            System.out.println(jobExecution.getJobId());
        }
    }
    • 启动时禁止job 运行
      application 配置
     
    spring.batch.job.enabled=false

    问题

    • If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
      解决方法:
      添加依赖
     
    <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>1.3.156</version>
    </dependency>

    参考资料

    https://mvnrepository.com/artifact/com.h2database/h2

  • 相关阅读:
    [bzoj3172] [Tjoi2013]单词
    [luogu2664] 树上游戏
    [bzoj3307] 雨天的尾巴
    [bzoj3141] [HNOI2013]旅行
    [bzoj4515] [SDOI2016]游戏
    [bzoj3165] [HEOI2013]Segment
    Spring MVC-从零开始-view-直接返回页面不传data
    Spring MVC-从零开始-view-ViewResolver
    Spring MVC-从零开始-@RequestMapping结合@PathVariable (从URL路径中取值,作用于函数参数)
    Spring MVC-从零开始-@RequestMapping 注解headers 属性
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/15083002.html
Copyright © 2020-2023  润新知