これまでこのブログでは、1つの処理単位(Tasklet)のみを扱ってきたが、複数の処理単位を順次実行することもできる。
今回は、EventGridTriggerを利用して、BlobにCSVファイルが作成されたタイミングで、そのCSVファイルをDBに書き込む処理を実行した後で、ログ出力する処理単位(Tasklet)を実行してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事のサンプルプログラムを作成済で、EventGridTriggerTestHandler.javaは、EventGridのCSVをDBに書き込む処理を残した状態になっていること。
また、以下の記事のPostmanをインストール済であること。
作成したサンプルプログラムの修正
前提条件の記事のサンプルプログラムに、ログ出力する処理単位(Tasklet)を追加する。なお、下記の赤枠は、前提条件のプログラムから変更・追加したプログラムである。
新しく追加したログ出力する処理単位(Tasklet)を定義したクラスは、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package com.example.batch; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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; import org.springframework.stereotype.Component; import com.example.model.EventGridTriggerParam; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @Component public class DemoTaskletLog implements Tasklet { /* Spring Bootでログ出力するためのLogbackのクラスを生成 */ private static final Logger LOGGER = LoggerFactory.getLogger(DemoTaskletLog.class); /** * Spring Batchのジョブ内でのログ出力処理を定義する. */ @Override public RepeatStatus execute(StepContribution contribution , ChunkContext chunkContext) throws Exception { // Spring Batchのジョブ内での処理が呼び出されたことをログ出力する String paramStr = chunkContext.getStepContext().getStepExecution() .getJobParameters().getString("eventGridTriggerParam"); EventGridTriggerParam param = null; if (paramStr != null) { param = new ObjectMapper().readValue(paramStr , new TypeReference<EventGridTriggerParam>() {}); LOGGER.info("DemoTaskletLog execute " + " triggered: " + param.getTimerInfo()); } // ジョブが終了したことを返す return RepeatStatus.FINISHED; } } |
また、新しく追加したログ出力する処理単位(Tasklet)を追加したジョブ定義クラスは以下の通りで、ジョブを定義するjobメソッドで、CSVファイルをDBに書き込む処理単位(step)を実行した後で、ログ出力する処理単位(stepLog)を呼び出すようにしている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | package com.example.batch; 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.launch.support.RunIdIncrementer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableBatchProcessing public class DemoTaskletConfig { /** Spring Batchのジョブ内で指定する実行処理を定義するクラス */ @Autowired private DemoTasklet demoTasklet; /** Spring Batchのジョブ内で指定するログ出力処理を定義するクラス */ @Autowired private DemoTaskletLog demoTaskletLog; /** Spring Batchのジョブを生成するクラス */ @Autowired private JobBuilderFactory jobBuilderFactory; /** Spring Batchのステップを生成するクラス */ @Autowired private StepBuilderFactory stepBuilderFactory; /** * Spring Batchのジョブ内で指定するCSVファイル取込処理(ステップ)を定義する. * @return Spring Batchのジョブ内で指定するCSVファイル取込処理 */ @Bean public Step step() { // 生成するステップ内でCSVファイル取込処理(Tasklet)を指定する return stepBuilderFactory .get("step") .tasklet(demoTasklet) .build(); } /** * Spring Batchのジョブ内で指定するログ出力処理(ステップ)を定義する. * @return Spring Batchのジョブ内で指定するログ出力処理 */ @Bean public Step stepLog() { // 生成するステップ内でログ出力する処理(Tasklet)を指定する return stepBuilderFactory .get("stepLog") .tasklet(demoTaskletLog) .build(); } /** * Spring Batchのジョブを定義する. * @param step CSVファイル取込処理 * @param stepLog ログ出力処理 * @return Spring Batchのジョブ */ @Bean public Job job(Step step, Step stepLog) { // 生成するジョブ内で、実行前後の処理(リスナ)と処理単位(ステップ)を指定する return jobBuilderFactory .get("job") .incrementer(new RunIdIncrementer()) .listener(listener()) .start(step) .next(stepLog) .build(); } /** * Spring Batchのジョブの実行前後の処理を定義する. * @return Spring Batchのジョブの実行前後の処理 */ @Bean public DemoJobListener listener() { return new DemoJobListener(); } } |
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/event-grid-trigger-multi-tasklet/demoAzureFunc
サンプルプログラムの実行結果
以下の記事の「EventGridのローカル環境での実行」に記載した通りに実行する。
実行した結果のログは以下の通りで、CSVファイルをDBに書き込むDemoTaskletクラスの処理を実行した後で、ログ出力するDemoTaskletLogクラスの処理が実行されたことが確認できる。
要点まとめ
- Spring Batchを利用しているプログラムで処理単位(Tasklet)を複数つなぐ処理は、Spring Batchのジョブ定義クラスで定義することができる。