Spring Batchメタデータ



MetaTableにロールとどのような内容が含まれているかを確認しようとします.

1. BATCH_JOB_INSTANCE


定義#テイギ#


BATCH JOB INSTANCE表:ジョブパラメータに基づいて作成された表
  • JOB_INSTANCE_ID 
    BATCH JOB INSTANCE表のPK
  • JOB_NAME
    実行するバッチジョブName
  • 上の写真を見ると、前の記事で実行したsimpleJobが保存されているのが見えます.BATCH_JOB_INSTANCE 테이블は、Job Parameterに基づいて生成されたテーブルである.
    Job Parameter:Spring Batchの実行時に外部から受信可能なパラメータ
    同じBatch Jobであっても、Job Parameterが異なるとBATCH_JOB_INSTANCEに書き込まれ、Job Parameterが同じであれば書き込まれない.

    変更されたコード


    SimpleJobConfig.java
    @Slf4j // log 사용을 위한 lombok 어노테이션
    @RequiredArgsConstructor // 생성자 DI를 위한 lombok 어노테이션
    @Configuration
    public class SimpleJobConfiguration {
        private final JobBuilderFactory jobBuilderFactory;
        private final StepBuilderFactory stepBuilderFactory;
    
        @Bean
        public Job simpleJob() {
            return jobBuilderFactory.get("simpleJob")
                    .start(simpleStep1(null))
                    .build();
        }
    
        @Bean
        @JobScope
        public Step simpleStep1(@Value("#{jobParameters[requestDate]}") String requestDate) {
            return stepBuilderFactory.get("simpleStep1")
                    .tasklet((contribution, chunkContext) -> {
                        log.info(">>>>> This is Step1");
                        log.info(">>>>> requestDate = {}", requestDate);
                        return RepeatStatus.FINISHED;
                    })
                    .build();
        }
    }
    
    変更されたコードは、Job Parameterとして受信した値をログに追加して出力する機能です.
    プログラムargumentsにrequestDate=20180805と入力します.

    実行結果


    次に、ジョブパラメータを追加してBatchを実行します.

    [環境を実行]タブをクリックして[設定]ウィンドウに移動します.

    プログラムargumentsにrequestDate=2180808080805と入力します.

    ジョブパラメータが転送され、ログがよく撮れていることが確認できます.
    ジョブパラメータが違うとジョブが動くと言っているので確認してみましょう.

    ジョブパラメータが違う


    プログラムargumentsにrequestDate=20211122と入力します.

    ジョブパラメータは同じです



    Jobはエラーコードと一緒に動作しません.

    2. BATCH_JOB_EXECUTION


    説明:


    JOB_EXECUTION 테이블4個のROWがある.
    この4つの実行データは、以前は実行パラメータがなかったsimpleJob、requestDate=2180808080805パラメータで実行されたsimpleJob、requestDate=218080808080808080806パラメータで実行されたsimpleJobまでである.JOB_EXECUTIONおよびJOB_INSTANCEは親子関係である.
    (JOB INSTACNE-親/JOB EXECUTION-子)
    JOB EXECUTIONは、両親のJOB INSTACNEの成功/失敗のすべての履歴を持っている.

    コードの変更


    SimpleJobConfig.java
    @Slf4j // log 사용을 위한 lombok 어노테이션
    @RequiredArgsConstructor // 생성자 DI를 위한 lombok 어노테이션
    @Configuration
    public class SimpleJobConfig{
        private final JobBuilderFactory jobBuilderFactory;
        private final StepBuilderFactory stepBuilderFactory;
    
        @Bean
        public Job simpleJob() {
            return jobBuilderFactory.get("simpleJob")
                    .start(simpleStep1(null))
                    .next(simpleStep2(null))
                    .build();
        }
    
        @Bean
        @JobScope
        public Step simpleStep1(@Value("#{jobParameters[requestDate]}") String requestDate) {
            return stepBuilderFactory.get("simpleStep1")
                    .tasklet((contribution, chunkContext) -> {
                        throw new IllegalArgumentException("step1에서 실패합니다.");
                    })
                    .build();
        }
    
        @Bean
        @JobScope
        public Step simpleStep2(@Value("#{jobParameters[requestDate]}") String requestDate) {
            return stepBuilderFactory.get("simpleStep2")
                    .tasklet((contribution, chunkContext) -> {
                        log.info(">>>>> This is Step2");
                        log.info(">>>>> requestDate = {}", requestDate);
                        return RepeatStatus.FINISHED;
                    })
                    .build();
        }
    }
    

    実行結果


    今回はJob ParameterをrequestDate=20211122に変更しました.


    予想されたExceptionとともに、Batch Jobが失敗したことがわかります.

    BATCH JOB EXECUTIONテーブルを確認します.
    4番目にFKでJOB INSTACNEをくわえたEXECUTIONがFAILEDであることが確認できます.
    コードを修正してJobを成功させる.

    変更されたコード

      @Bean
        @JobScope
        public Step simpleStep1(@Value("#{jobParameters[requestDate]}") String requestDate) {
            return stepBuilderFactory.get("simpleStep1")
                    .tasklet((contribution, chunkContext) -> {
                        log.info(">>>>> This is Step1");
                        log.info(">>>>> requestDate = {}", requestDate);
                        return RepeatStatus.FINISHED;
                    })
                    .build();
        }

    上の図に示すように、変更されたコードで再実行し、ジョブが正常に実行されたことを確認します.

    表を見ることで、JOB INSTANCEとBATCH JOB EXECUTIONの違いを特定できます.
    BATCH JOB EXECUTIONのJOB INSTANCE ID列には、同じID(4)を持つ2つのROWが見られる.
    このうち1番目のROW STATUSはFAILED、2番目のROWはCOMPLETEDである.
    Job ParameterrequestDate=20211123で生成されたBATCH JOB INSTACNE(id=4)は2回運転され、1回目は失敗、2回目は成功した.
    同じジョブパラメータで2回実行しますが、同じパラメータで実行するエラーは発生しません.
    Spring Batchは、同じジョブパラメータが正常に記録されている場合にのみ、再実行できないことを知ることができます.

    3. JOB, JOB_INSTANCE, JOB_EXECUTION



    ここで言うJobは上に書いてあるSpringBatch Jobです.
    上記の2つのテーブルに加えて、Jobに関連するテーブルがさらに存在する.
  • BATCH_JOB_EXECUTION_PARAMBATCH JOB EXECUTIONテーブル作成時に入力したジョブパラメータを含む.
  • Reference


    https://jojoldu.tistory.com/326?category=902551