使用Java + Spring Batch Tasklet + Spring Boot来实现Hello World

总结

    Spring Batch の Tasklet と Spring Boot の組み合わせでシンプルな Hello World 出力バッチプログラムを作る

环境

    • Spring Batch 4.3.1 + Spring Boot 2.4.2

 

    • Java 11 (AdoptOpenJDK 11.0.10+9)

 

    • Gradle 6.8.1

 

    macOS Catalina

Spring Batch的执行配置

    • Job が複数の Step を呼び出す

 

    Step が Tasklet を呼び出す

“工作”是什么?

Spring Batch批处理的领域语言-参考资料

在Spring Batch中,Job只是Step实例的容器。通过组合在逻辑上属于同一个流程的多个步骤,可以实现对所有步骤的全局属性进行配置,包括可重新启动性等。

“Step” 是什么意思?

Spring Batch 批处理的领域语言 – 参考资料

Step是一个领域对象,它封装了批处理作业的独立顺序阶段。每个作业完全由一个或多个步骤组成。Step包含了定义和控制实际批处理处理所需的所有信息。

Tasklet 是什么?

Spring Batch步骤的配置- 参考文档

Tasklet 是一个简单的接口,它具有一个名为 execute 的方法。execute 方法会被 TaskletStep 反复调用,直到返回 RepeatStatus.FINISHED 或抛出异常来通知失败。

源代码

文件列表

├── build.gradle
└── src
    └── main
        └── java
            └── com
                └── example
                    └── hello
                        ├── HelloApplication.java
                        ├── HelloConfig.java
                        └── MessageTasklet.java

创建.gradle文件

plugins {
  id 'org.springframework.boot' version '2.4.2'
  id 'io.spring.dependency-management' version '1.0.11.RELEASE'
  id 'java'
}

group = 'com.example'
version = '0.0.1'
sourceCompatibility = '11'

repositories {
  mavenCentral()
}

dependencies {
  // Spring Batch
  implementation 'org.springframework.boot:spring-boot-starter-batch'

  // Spring Batch のメタデータを入れるデータベース
  implementation 'com.h2database:h2:1.4.200'

  // Lombok
  compileOnly 'org.projectlombok:lombok:1.18.18'
  annotationProcessor 'org.projectlombok:lombok:1.18.18'
}

src/main/java/com/example/hello/HelloApplication.java 的原始代码。

package com.example.hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// Spring Boot アプリケーションクラス
@SpringBootApplication
public class HelloApplication {

  public static void main(String[] args) {
    SpringApplication.run(HelloApplication.class, args);
  }
}

src/main/java/com/example/hello/HelloConfig.java 的原始代码。

package com.example.hello;

import lombok.RequiredArgsConstructor;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// バッチ構成クラス
@Configuration // Bean 定義クラスであることを示すアノテーション
@EnableBatchProcessing // Spring Batch を有効にする
@RequiredArgsConstructor // Lombok によるコンストラクタ自動生成
public class HelloConfig {

  private final JobBuilderFactory jobBuilderFactory;
  private final StepBuilderFactory stepBuilderFactory;

  @Bean
  public Job fooJob() {
    System.out.println("fooJob メソッドを実行");
    return jobBuilderFactory.get("myFooJob") // 一意となる任意のジョブ名を指定
      .flow(helloStep()) // 実行する Step を指定
      .end()
      .build();
  }

  @Bean
  public Job barJob() {
    System.out.println("barJob メソッドを実行");
    return jobBuilderFactory.get("myBarJob") // 一意となる任意のジョブ名を指定
      .flow(helloStep()) // 実行する Step を指定
      .next(worldStep()) // 実行する Step を指定
      .end()
      .build();
  }

  @Bean
  public Step helloStep() {
    System.out.println("helloStep メソッドを実行");
    return stepBuilderFactory.get("myHelloStep") // 任意のステップ名を指定
      .tasklet(new MessageTasklet("Hello!")) // 実行する Tasklet を指定
      .build();
  }

  @Bean
  public Step worldStep() {
    System.out.println("worldStep メソッドを実行");
    return stepBuilderFactory.get("myWorldStep") // 任意のステップ名を指定
      .tasklet(new MessageTasklet("World!")) // 実行する Tasklet を指定
      .build();
  }
}

源代码的路径是:src/main/java/com/example/hello/MessageTasklet.java

package com.example.hello;

import lombok.RequiredArgsConstructor;
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;

// Tasklet 実装クラス
@RequiredArgsConstructor // Lombok によるコンストラクタ自動生成
public class MessageTasklet implements Tasklet {

  // 出力するメッセージ
  private final String message;

  // 具体的な処理を実装するメソッド
  @Override
  public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
    System.out.println("Message: " + message); // メッセージを出力
    return RepeatStatus.FINISHED; // 処理が終了したことを示す値を返す
  }
}

建筑

$ gradle build

执行

执行myFooJob

$ java -jar build/libs/hello-batch-0.0.1.jar --spring.batch.job.names=myFooJob --logging.level.root=ERROR

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.2)

fooJob メソッドを実行
helloStep メソッドを実行
barJob メソッドを実行
worldStep メソッドを実行
Message: Hello!

执行我的酒吧工作

$ java -jar build/libs/hello-batch-0.0.1.jar --spring.batch.job.names=myBarJob --logging.level.root=ERROR

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.2)

fooJob メソッドを実行
helloStep メソッドを実行
barJob メソッドを実行
worldStep メソッドを実行
Message: Hello!
Message: World!

完成所有工作

如果在Spring Boot + Spring Batch的配置中未指定spring.batch.job.names或spring.batch.job.enabled=false,则将执行所有作业。

$ java -jar build/libs/hello-batch-0.0.1.jar --logging.level.root=ERROR

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.2)

fooJob メソッドを実行
helloStep メソッドを実行
barJob メソッドを実行
worldStep メソッドを実行
Message: Hello!
Message: Hello!
Message: World!

请参考提供的资料。

参考信息

参考资料见如下。

请参考相关资料。

    • Spring Batch – リファレンスドキュメント

 

    • Spring Batch ステップの構成 – リファレンスドキュメント

 

    • Spring Batch メタデータスキーマ – リファレンスドキュメント

 

    • 2.3. Spring Batchのアーキテクチャ – TERASOLUNA Batch Framework for Java (5.x) Development Guideline

 

    • 3.3. タスクレットモデルジョブの作成 – TERASOLUNA Batch Framework for Java (5.x) Development Guideline

 

    • Spring Batch 4.3.1 API ドキュメント – Javadoc

 

    • Spring Boot 2.4.2 API ドキュメント – Javadoc

 

    • Spring Framework 5.3.3 API ドキュメント – Javadoc

 

    まずは実践、Spring Boot Batchの動かし方 – Qiita
广告
将在 10 秒后关闭
bannerAds