🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Spring Batch

Spring Batchは、バッチ処理向けに定義されたオープンソースのフレームワーク。エンタープライズシステムで避けて通れないバッチ処理を可能にします。設定ファイルに別定義することで効率よく開発することがで可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

3297閲覧

Spring Batch Flowの実行で無限ループになってしまう

yamame01

総合スコア16

Spring Batch

Spring Batchは、バッチ処理向けに定義されたオープンソースのフレームワーク。エンタープライズシステムで避けて通れないバッチ処理を可能にします。設定ファイルに別定義することで効率よく開発することがで可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/01/25 07:36

前提・実現したいこと

Spring Batchを作成しています。
実行時に分岐する為、処理をまとめたいと思いますが、FlowBuilderで作成したFlowをJobへ渡すと
最初の処理が終わらなくなってしまいます。

最終的にやりたいことは
Step1がOKだったら、Step2・Step3・Step4の順で実行
Step1がNGだったら、Step3・Step4を実行
のようにしたく、Step3とStep4をまとめたいため、Flowを使用しようとしております。
※下記ソースコードではまだ分岐まで行っておらず、Flowで処理をまとめるところでつまずいております。

発生している問題・エラーメッセージ

下記ソースにて無限ループになってしまいます。

該当のソースコード

Java

1 @Bean 2 public Job job(@Qualifier("flow1") final Flow flow1 3 ) 4 throws Exception { 5 6 return jobBuilderFactory.get(_JOB_NAME) 7 .incrementer(new RunIdIncrementer()) 8 .start(flow1) 9 .end() 10 .build(); 11 } 12 13 @Bean 14 public Flow flow1( 15 @Qualifier("step1") final Step step1, 16 @Qualifier("step2") final Step step2) throws Throwable { 17 return new FlowBuilder<SimpleFlow>("retryModeFlow") 18 .start(step1) 19 .next(step2) 20 .build(); 21 } 22 23 24 @Bean 25 public Step step1() throws Throwable { 26 return stepBuilderFactory 27 .get(_JOB_STEP_NAME) 28 .tasklet(new Tasklet() { 29 @Override public RepeatStatus execute(StepContribution contribution, 30 ChunkContext chunkContext) throws Exception { 31 System.out.println("step1"); 32 return RepeatStatus.FINISHED; 33 } 34 }) 35 .build(); 36 } 37 38 @Bean 39 public Step step2() throws Throwable { 40 return stepBuilderFactory 41 .get(_JOB_STEP_NAME) 42 .tasklet(new Tasklet() { 43 @Override public RepeatStatus execute(StepContribution contribution, 44 ChunkContext chunkContext) throws Exception { 45 System.out.println("step2"); 46 return RepeatStatus.FINISHED; 47 } 48 }) 49 .build(); 50 }

上記を実行したところ、結果が

step1 step1 step1 step1 step1 ...

となってしまいます。

試したこと

Flowを使用せずJobBuilterに直接Stepを渡した場合だと、正常に終了いたします。

Java

1 @Bean 2 public Job job(@Qualifier("flow1") final Flow flow1 3 ) 4 throws Exception { 5 6 return jobBuilderFactory.get(_JOB_NAME) 7 .incrementer(new RunIdIncrementer()) 8 .start(step1) 9 .next(step2) 10 .build(); 11 } 12 13 14 @Bean 15 public Step step1() throws Throwable { 16 return stepBuilderFactory 17 .get(_JOB_STEP_NAME) 18 .tasklet(new Tasklet() { 19 @Override public RepeatStatus execute(StepContribution contribution, 20 ChunkContext chunkContext) throws Exception { 21 System.out.println("step1"); 22 return RepeatStatus.FINISHED; 23 } 24 }) 25 .build(); 26 } 27 28 @Bean 29 public Step step2() throws Throwable { 30 return stepBuilderFactory 31 .get(_JOB_STEP_NAME) 32 .tasklet(new Tasklet() { 33 @Override public RepeatStatus execute(StepContribution contribution, 34 ChunkContext chunkContext) throws Exception { 35 System.out.println("step2"); 36 return RepeatStatus.FINISHED; 37 } 38 }) 39 .build(); 40 }
step1 step2

補足情報(FW/ツールのバージョンなど)

こちらを参考に作成しております。
https://spring.pleiades.io/spring-batch/docs/current/reference/html/step.html#external-flows

Versions
spring-boot-starter-parent : 2.0.1.RELEASE

お詳しい方、ご教授の程よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

初歩的なミスでした。。
step1, step2のget(/* step名 */)のところで、同じ変数を渡してしまっており
同じ名前になってしまっていたことが原因でした。

以下修正点のみ抜粋。

Java

1 @Bean 2 public Step step1() throws Throwable { 3 return stepBuilderFactory 4 .get("step1") // ここを修正 5 .tasklet(new Tasklet() { 6 @Override public RepeatStatus execute(StepContribution contribution, 7 ChunkContext chunkContext) throws Exception { 8 System.out.println("step1"); 9 return RepeatStatus.FINISHED; 10 } 11 }) 12 .build(); 13 } 14 15 @Bean 16 public Step step2() throws Throwable { 17 return stepBuilderFactory 18 .get("step2") // ここを修正 19 .tasklet(new Tasklet() { 20 @Override public RepeatStatus execute(StepContribution contribution, 21 ChunkContext chunkContext) throws Exception { 22 System.out.println("step2"); 23 return RepeatStatus.FINISHED; 24 } 25 }) 26 .build(); 27 }

上記の修正をすることで解決いたしました。
ご覧になってくださった方、ありがとうございました。

投稿2021/01/25 14:11

yamame01

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問