これまでこのブログでは、1つの処理単位(Tasklet)のみを扱ってきたが、複数の処理単位を順次実行することもできる。
今回は、EventGridTriggerを利用して、BlobにCSVファイルが作成されたタイミングで、そのCSVファイルをDBに書き込む処理を実行した後で、ログ出力する処理単位(Tasklet)を実行してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事のサンプルプログラムを作成済で、EventGridTriggerTestHandler.javaは、EventGridのCSVをDBに書き込む処理を残した状態になっていること。

また、以下の記事のPostmanをインストール済であること。

 
 
作成したサンプルプログラムの修正
前提条件の記事のサンプルプログラムに、ログ出力する処理単位(Tasklet)を追加する。なお、下記の赤枠は、前提条件のプログラムから変更・追加したプログラムである。
 
新しく追加したログ出力する処理単位(Tasklet)を定義したクラスは、以下の通り。
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)を呼び出すようにしている。
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のジョブ定義クラスで定義することができる。





