SlideShare une entreprise Scribd logo
1  sur  72
Batchは作ったことあるけど、
初めてSpring Batchを使ってみた
JSUG勉強会 2020年その4 Spring Batch
2020-05-13(水)
へー/heisy(笹倉 秀行)
自己紹介
● へー/heisy(笹倉 秀行)
○ Twitter : @heisy
○ 日本コンピュータシステム株式会社
● 好きなもの
○ AWS
○ DDD / TDD
○ ボルダリング(おおよそ4級)
○ 日本酒:王祿、賀茂鶴
このセッションを聞くのに、やっておいた方がいいこと
● Spring Bootを使ったことがある
● バッチをJava以外で作ったことがある
※必須じゃありません。
このセッションを聞いて欲しい人
● Spring Batchを使ったことがない人
● Spring Batchを使ってみようと思ってる人
● Spring Batchを使おうとして、挫折した人
このセッションを聞いて欲しい人
● Spring Batchを使ったことがない人
● Spring Batchを使ってみようと思ってる人
● Spring Batchを使おうとして、
挫折した人
このセッションを聞いて欲しい聞かせたい人
つまり、過去の私
このセッションを発表するに至った経緯
ちょうど二年前
このセッションを発表するに至った経緯
はーい、わかりましたー。
バッチ作っておいてー!
WebアプリはSpringBoot使ってるから、
できればSpring Batchで作ってね!
(この現場では導入できてない)
今度、DBから条件に合うユーザデータを取
得して、他システムへデータを送るバッチ
作ってよー
はい!やってみます!
👱
♂️
🙂
このセッションを発表するに至った経緯
できませんでした
(JavaのStandAloneでスクラッチで作りました)
このセッションを発表するに至った経緯
ちょうど一年前
このセッションを発表するに至った経緯
はーい、わかりましたー。(またかよ)
バッチ作っておいてー!
今度こそSpring Batchで作ってね!!
今度、他システムから条件に合うユーザデ
ータを取得して、他システムへデータを送
るバッチ作ってよー
はい!!やってみます!!
👱
♂️
🙂
このセッションを発表するに至った経緯
できませんでした
(前回と同様にJavaのStandAloneでスクラッチで作りました)
このセッションのゴール(私の思い)
Spring Batchでバッチを作ると、
「こんなに便利なんだ!」
「こんなに簡単なんだ!」
って気付いてもらうこと!🙏
「バッチとは何か?」
バッチとは何か?
バッチ処理とは、コンピュータで1つの流れのプログラム群
(ジョブ)を順次に実行すること。
参照:https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86
バッチの基本的な構成
Batch OutputInput
バッチの基本的な構成
Batch
Input
Database
File
API
Output
Database
File
API
バッチの基本的な構成:バッチの一例(私の過去より)
Batch
Main Logic
File Access Business Logic
FileReader
FileWriter
Business Logic DAO
Business Logic
Mail SenderData Check
Validation
public static void main(String[] args) {
File file = null;
try {
file = new File(args[0]);
FileReader fileReader = null;
try {
fileReader = new FileReader(file);
BufferedReader reader = null;
try {
reader = new BufferedReader(fileReader);
String input = null;
while ((input = reader.readLine()) != null) {
if (dataCheck(input)) {
throw new IllegalArgumentException("入力データおかしい
よ");
}
Person person = convert(input);
List<Person> familyList = accessDatabase(person);
if (validation(familyList)) {
throw new IllegalStateException("生成データがおかしい
よ");
}
process(person);
sendMail(person);
バッチの基本的な構成:よくあるコードの一例(私の過去より)
File log = new File(args[1]);
FileWriter filewriter = null;
try {
filewriter = new FileWriter(log);
int count = 0;
for (Person family : familyList) {
filewriter.write(family.getName());
if (count++ % 5 == 1) {
filewriter.flush();
}
}
} finally {
if (filewriter != null) {
filewriter.flush();
filewriter.close();
}
}
}
} finally {
if (reader != null) {
reader.close();
}
}
} finally {
if (fileReader != null) {
バッチの基本的な構成:課題
バッチという1つのプログラム内に
様々な処理が混在して、
密結合であることが多い!
「Spring Batchを使うと、何が嬉しいのか?」
Spring Batchを使うと、何が嬉しいのか?
● バッチのユースケースを定義
● バッチの処理のテンプレートを提供
● 各処理を疎結合にしやすい
● よく使う機能(処理)は既にある
Spring Batchのユースケース
一般的なバッチプログラム:
● データベース、ファイル、またはキューから大量のレコ
ードを読み取ります。
● 何らかの方法でデータを処理します。
● 変更された形式でデータを書き戻します。
参照:https://spring.pleiades.io/spring-batch/docs/current/reference/html/spring-batch-intro.html#springBatchUsageScenarios
Spring Batch
Spring Batchのユースケースに紐づく基本的な構成
OutputInput
Spring Batchのユースケースに紐づく基本的な構成
Input
Database
File
API
Output
Database
File
API
Spring Batch
Spring Batchのユースケース:ビジネスシナリオ
● 定期的にバッチプロセスをコミットする
● 同時バッチ処理 : ジョブの並列処理
● 段階的なエンタープライズメッセージ駆動型処理
● 超並列バッチ処理
● 障害後の手動またはスケジュールされた再起動
● 従属ステップの順次処理 (ワークフロー駆動型バッチの拡張機能付き)
● 部分処理 : レコードをスキップ (たとえば、ロールバック時)
● バッチサイズが小さい場合や既存のストアドプロシージャ / スクリプトを使
用する場合の一括バッチトランザクション
参照:https://spring.pleiades.io/spring-batch/docs/current/reference/html/spring-batch-intro.html#springBatchUsageScenarios
Spring Batchが提供する機能
● トランザクション管理
● チャンクベースの処理
● 宣言的 I/O
● 開始 / 停止 / 再起動
● 再試行 / スキップ
● Web ベースの管理インターフェース ( Spring Cloud Data Flow )
参照:https://spring.pleiades.io/projects/spring-batch#overview
Spring Batchのアーキテクチャ
参照:https://spring.pleiades.io/spring-batch/docs/current/reference/html/spring-batch-intro.html#spring-batch-intro
Spring Batchのアーキテクチャ
参照:https://spring.pleiades.io/spring-batch/docs/current/reference/html/domain.html#domainLanguageOfBatch
Spring Batchのアーキテクチャ
1. JobLauncher : Jobを起動する
2. Job : 1つ・複数のStepを順に実行する
3. Step : 入力処理・業務処理・出力処理を繋げて実行する
4. JobRepository : JobLauncher・Job・Stepの間でデータ連携を行う
5. ItemReader : 入力処理
6. ItemProcessor : 業務処理
7. ItemWrider : 出力処理
Spring Batchを使うと、何が嬉しいのか?(再)
● バッチのユースケースを定義
● バッチの処理のテンプレートを提供
● 各処理を疎結合にしやすい
● よく使う機能(処理)は既にある
Spring Batchを使ってみよう!
Spring Batchを使ってみよう!
まず始めはチュートリアルから
Spring Batchのチュートリアル
Spring入門ガイド
「バッチサービスの作成」
をやってみた
参照:https://spring.pleiades.io/guides/gs/batch-processing/
Spring Batchのチュートリアル
Database
Spring BatchCSV
参照:https://spring.pleiades.io/guides/gs/batch-processing/
Spring Batchのチュートリアル
すごい!
ちょー簡単!
Spring Batchのチュートリアル
あれ?
Spring Batchのチュートリアル
もうこのセッション
いらなくね?
Spring Batchの簡単なサンプル
負けちゃダメだ!
(心の声)
Spring Batchの簡単なサンプル
ここからが本編です!
Spring Batchの簡単なサンプル
Spring Batchの簡単なスケルトンコードを作成します!
(ちゃんと動きます)
Spring Batchの簡単なサンプル
参照:https://spring.pleiades.io/spring-batch/docs/current/reference/html/domain.html#domainLanguageOfBatch
主に作る箇所
Spring Batchの簡単なサンプル:シーケンス
参照: https://spring.pleiades.io/spring-batch/docs/current/reference/html/step.html#configureStep
Job
Spring Batchの簡単なサンプル:流れ
1. Spring initializrでプロジェクト作成
2. 入力・出力itemクラス作成
3. ItemReader作成
4. ItemProcessor作成
5. ItemWriter作成
6. @Configuration・@EnableBatchProcessingのクラスを作成
Spring Batchの簡単なサンプル:クラス図
Spring Batchの簡単なサンプル:Spring initializrでプロジェクト作成
Spring Batchの簡単なサンプル:入力・出力itemクラス作成
public class InputItem {
private String data;
public InputItem(String data) {
this.data = data;
}
}
public class OutputItem {
private String data;
public OutputItem(String data) {
this.data = data;
}
}
※Setter/Getter省略
入力itemクラス: 出力itemクラス:
Spring Batchの簡単なサンプル:ItemReader作成
public class BatchItemReader implements ItemReader<InputItem> {
private static final Logger log = LoggerFactory.getLogger(BatchItemReader.class);
private static int count = 0;
@Override
public InputItem read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
log.info("called read method");
// 本当はここでデータをDBやファイルを読み取る
if (count++ > 1) {
return null; // データを読み終わったら、nullを返却すること
}
// 読み取ったデータを入力データクラスへ詰めて、返却
return new InputItem("data");
}
}
Spring Batchの簡単なサンプル:ItemProcessor作成
public class BatchItemProcessor implements ItemProcessor<InputItem, OutputItem> {
private static final Logger log = LoggerFactory.getLogger(BatchItemProcessor.class);
@Override
public OutputItem process(InputItem InputItem) throws Exception {
log.info("called process method");
// ここでデータのバリデーションチェックをやる
// 入力データを出力データへ変換する
OutputItem outputItem = new OutputItem(InputItem.getData().toUpperCase());
log.info("Input (" + InputItem + "), Output (" + outputItem + ")");
return outputItem;
}
}
Spring Batchの簡単なサンプル:ItemWriter作成
public class BatchItemWriter implements ItemWriter<OutputItem> {
private static final Logger log = LoggerFactory.getLogger(BatchItemWriter.class);
@Override
public void write(List<? extends OutputItem> items) throws Exception {
log.info("called write method");
// 本当はここでデータをDBやファイルへ出力する
log.info("Output (" + items + ")");
}
}
Spring Batchの簡単なサンプル:@Configuration・@EnableBatchProcessingのク
ラスを作成
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public ItemReader<InputItem> reader() {
return new BatchItemReader();
}
@Bean
public ItemProcessor<InputItem, OutputItem> processor() {
return new BatchItemProcessor();
}
@Bean
public ItemWriter<OutputItem> writer() {
return new BatchItemWriter();
}
@Bean
public Step step1() {
return this.stepBuilderFactory.get("step1").<InputItem,
OutputItem>chunk(10).reader(reader())
.processor(processor()).writer(writer()).build();
}
@Bean
public Job runJob() {
return
this.jobBuilderFactory.get("runJob").start(step1()).build();
}
}
Spring Batchの簡単なサンプル
以上!
Spring Batchの簡単なサンプル
デモします
Spring Batchの色んなItemReader
● FlatFileItemReader
● HibernateCursorItemReader
● JmsItemReader
● ListItemReader
● RepositoryItemReader
● JsonItemReader
他にもあります!
参照:https://spring.pleiades.io/spring-batch/docs/current/reference/html/appendix.html#listOfReadersAndWriters
Spring Batchの色んなItemWriter
● FlatFileItemWriter
● HibernateItemWriter
● JmsItemWriter
● RepositoryItemWriter
● JsonFileItemWriter
他にもあります!
参照:https://spring.pleiades.io/spring-batch/docs/current/reference/html/appendix.html#listOfReadersAndWriters
Spring Batchの簡単なサンプル
Stepの前後に処理したい時には
StepExecutionListener
Spring Batchの簡単なサンプル:StepExecutionListener
@Component
public class StepListener implements StepExecutionListener {
private static final Logger log = LoggerFactory.getLogger(StepListener.class);
@Override
public void beforeStep(StepExecution stepExecution) {
// Stepを実行する前に実行する処理を書く
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
// Stepを実行した後に実行する処理を書く
return ExitStatus.COMPLETED;
}
}
Spring Batchの簡単なサンプル:@Configuration・@EnableBatchProcessingのク
ラスをちょっと変える
@Bean
public Step step1(StepListener listener) {
return this.stepBuilderFactory.get("step1").<InputItem,
OutputItem>chunk(1).reader(reader())
.processor(processor()).writer(writer()).listener(listener).build();
}
Spring Batchの簡単なサンプル
Jobの前後に処理したい時には
JobExecutionListener
Spring Batchの簡単なサンプル:JobExecutionListener
@Component
public class JobListener implements JobExecutionListener {
private static final Logger log = LoggerFactory.getLogger(JobListener.class);
@Override
public void beforeJob(JobExecution jobExecution) {
// Jobを実行する前に実行する処理を書く
}
@Override
public void afterJob(JobExecution jobExecution) {
// Jobを実行した後に実行する処理を書く
if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
log.info("!!! JOB FINISHED! Time to verify the results");
}
}
}
Spring Batchの簡単なサンプル:@Configuration・@EnableBatchProcessingのク
ラスをちょっと変える
@Bean
public Job runJob(JobListener listener, Step step1) {
return
this.jobBuilderFactory.get("runJob").listener(listener).start(step1).build();
}
Spring Batchの簡単なサンプル
デモします
他にもSpring Batchで出来るパターン
今まで紹介したStepはチャンク指向の処理
他にもSpring Batchで出来るパターン
Stepはタスクレットの処理もできます
他にもSpring Batchで出来るパターン
タスクレット(Tasklet)=ItemReader・ItemProcessor・
ItemWriterを一つにまとめたもの
Spring Batchの簡単なサンプル
参照:https://spring.pleiades.io/spring-batch/docs/current/reference/html/domain.html#domainLanguageOfBatch
Tasklet
こんな感じ
1 *
他にもSpring Batchで出来るパターン:Tasklet
public class BatchTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)
throws Exception {
// ここで好きなの処理をやる
return RepeatStatus.FINISHED;
}
}
他にもSpring Batchで出来るパターン:@Configuration・
@EnableBatchProcessingのクラスをちょっと変える
@Bean
public Tasklet tasklet() {
return new BatchTasklet();
}
@Bean
public Step step2() {
return this.stepBuilderFactory.get("step2").tasklet(tasklet()).build();
}
他にもSpring Batchで出来るパターン
デモします
以上です!
本日のサンプルコード:
https://github.com/heisy3390/demo3
有り難うございました!

Contenu connexe

Tendances

Redmineをつかったスクラム開発のはじめの一歩
Redmineをつかったスクラム開発のはじめの一歩Redmineをつかったスクラム開発のはじめの一歩
Redmineをつかったスクラム開発のはじめの一歩
kiita312
 

Tendances (20)

Cloud runのオートスケールを検証してみる
Cloud runのオートスケールを検証してみるCloud runのオートスケールを検証してみる
Cloud runのオートスケールを検証してみる
 
ビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分けビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分け
 
Spring Initializrをハックする-カスタマイズを通してその内部実装を覗く
Spring Initializrをハックする-カスタマイズを通してその内部実装を覗くSpring Initializrをハックする-カスタマイズを通してその内部実装を覗く
Spring Initializrをハックする-カスタマイズを通してその内部実装を覗く
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
 
DevOpsにおけるAnsibleの立ち位置と使い所
DevOpsにおけるAnsibleの立ち位置と使い所DevOpsにおけるAnsibleの立ち位置と使い所
DevOpsにおけるAnsibleの立ち位置と使い所
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring
 
Rest ful api設計入門
Rest ful api設計入門Rest ful api設計入門
Rest ful api設計入門
 
Spring Cloud Data Flow の紹介 #streamctjp
Spring Cloud Data Flow の紹介  #streamctjpSpring Cloud Data Flow の紹介  #streamctjp
Spring Cloud Data Flow の紹介 #streamctjp
 
CI/CDツール比較してみた
CI/CDツール比較してみたCI/CDツール比較してみた
CI/CDツール比較してみた
 
Redmineをつかったスクラム開発のはじめの一歩
Redmineをつかったスクラム開発のはじめの一歩Redmineをつかったスクラム開発のはじめの一歩
Redmineをつかったスクラム開発のはじめの一歩
 
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
 
DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)について
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
Ansibleはじめよぉ -Infrastructure as Codeを理解-
Ansibleはじめよぉ -Infrastructure as Codeを理解-Ansibleはじめよぉ -Infrastructure as Codeを理解-
Ansibleはじめよぉ -Infrastructure as Codeを理解-
 
Spring tools4
Spring tools4Spring tools4
Spring tools4
 

Similaire à Batchは作ったことあるけど、 初めてSpring Batchを使ってみた (6)

データベース11 - データベースとプログラム
データベース11 - データベースとプログラムデータベース11 - データベースとプログラム
データベース11 - データベースとプログラム
 
みんなのPython勉強会#77 パッケージングしよう
みんなのPython勉強会#77 パッケージングしようみんなのPython勉強会#77 パッケージングしよう
みんなのPython勉強会#77 パッケージングしよう
 
React+TypeScriptもいいぞ
React+TypeScriptもいいぞReact+TypeScriptもいいぞ
React+TypeScriptもいいぞ
 
T4使ってみた
T4使ってみたT4使ってみた
T4使ってみた
 
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 

Batchは作ったことあるけど、 初めてSpring Batchを使ってみた