SpringBatchで再試行機能が機能しない

TikTik

ScriptBatch.3.0.xバージョンを使用しているバッチジョブがあります。

私のユースケースは、間に中間障害が発生した場合にジョブを再試行することです。

チャンクベースの処理とStepBuilderFactoryをジョブに使用しています。再試行を追加しても違いはわかりませんでした。

    return stepBuilderFactory.get("ValidationStepName")
            .<Long, Info> chunk(10)
            .reader(.....)
            .processor(.....)
    //        .faultTolerant()
    //        .retryLimit(5)
    //        .retryLimit(5).retry(Exception.class)
            .writer(......)
            .faultTolerant()
            .retryLimit(5)
            //.retryLimit(5).retry(Exception.class)
            .transactionManager(jpaTransactionManager())
            .listener(new ChunkNotificationListener())
            .build();

ここで何かが足りないかどうかはわかりませんが、retryLimit()を追加すると、例外が発生したときに同じチャンクがn回再試行されることを期待しています。

マフムードベンハッシン

ここで、retryLimit()を追加すると、例外が発生したときに同じチャンクがn回再試行されることを期待しています。

再試行制限を指定する場合は、再試行する例外を指定する必要があります。それ以外の場合はIllegalStateException、次のメッセージが表示されますIf a retry limit is provided then retryable exceptions must also be specified

編集:

ポイント1:次のテストはバージョン3.0.9で合格しています。

import java.util.Arrays;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.tasklet.TaskletStep;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.batch.item.support.ListItemWriter;
import org.springframework.transaction.PlatformTransactionManager;

@RunWith(MockitoJUnitRunner.class)
public class TestRetryConfig {

    @Rule
    public ExpectedException expectedException = ExpectedException.none();
    @Mock
    private JobRepository jobRepository;
    @Mock
    PlatformTransactionManager transactionManager;

    @Test
    public void testRetryLimitWithoutException() {
        expectedException.expect(IllegalStateException.class);
        expectedException.expectMessage("If a retry limit is provided then retryable exceptions must also be specified");

        StepBuilderFactory stepBuilderFactory = new StepBuilderFactory(jobRepository, transactionManager);

        TaskletStep step = stepBuilderFactory.get("step")
                .<Integer, Integer>chunk(2)
                .reader(new ListItemReader<>(Arrays.asList(1, 2, 3)))
                .writer(new ListItemWriter<>())
                .faultTolerant()
                .retryLimit(3)
                .build();
    }
}

再試行する例外タイプなしで再試行制限を指定すると、ステップ構成が失敗するはずであることを示しています。

ポイント2:次のサンプルは、宣言された例外タイプが期待どおりに再試行されることを示しています(バージョン3.0.9でもテスト済み)。

import java.util.Arrays;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
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.JobLauncher;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class MyJob {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

    @Bean
    public ItemReader<Integer> itemReader() {
        return new ListItemReader<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
    }

    @Bean
    public ItemWriter<Integer> itemWriter() {
        return items -> {
            for (Integer item : items) {
                System.out.println("item = " + item);
                if (item.equals(7)) {
                    throw new Exception("Sevens are sometime nasty, let's retry them");
                }
            }
        };
    }

    @Bean
    public Step step() {
        return steps.get("step")
                .<Integer, Integer>chunk(5)
                .reader(itemReader())
                .writer(itemWriter())
                .faultTolerant()
                .retryLimit(3)
                .retry(Exception.class)
                .build();
    }

    @Bean
    public Job job() {
        return jobs.get("job")
                .start(step())
                .build();
    }

    public static void main(String[] args) throws Exception {
        ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
        JobLauncher jobLauncher = context.getBean(JobLauncher.class);
        Job job = context.getBean(Job.class);
        jobLauncher.run(job, new JobParameters());
    }

}

印刷します:

item = 1
item = 2
item = 3
item = 4
item = 5
item = 6
item = 7
item = 6
item = 7
item = 6
item = 7

アイテム7が3回再試行された後、期待どおりにステップが失敗します。

これがお役に立てば幸いです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

RestControllerでSpringの再試行が機能しない

分類Dev

Spring Integration + SQS-例外での再試行が機能しない

分類Dev

RxJSを再試行してから、catchErrorが機能しない

分類Dev

再試行機能が3カウントを超えて機能しない

分類Dev

karatedslの再試行機能が機能していません

分類Dev

WorkManagerの再試行が機能しない

分類Dev

リボン再試行構成が機能しない

分類Dev

SpringBatch-beforeJobが機能していないようです

分類Dev

bigqueryで更新を再試行しても機能しないようです

分類Dev

再試行可能な注釈が春のバッチアプリケーションで機能しない

分類Dev

Spring再試行テンプレートが@ org.springframework.transaction.annotation.Transactionalで機能しない

分類Dev

C#-Selenium-再試行属性がSeleniumタイムアウトで機能しない

分類Dev

AzurePython関数の再試行制限がロジックアプリで機能しない

分類Dev

AzurePython関数の再試行制限がロジックアプリで機能しない

分類Dev

接続切断が機能しない場合は再試行してください

分類Dev

PHPDISTINCTが2行で機能しない

分類Dev

pipが機能しない、TTPSConnectionPool(host = 'pypi.org'、port = 443):最大再試行回数を超えました

分類Dev

成功が機能しなくなるまでmove-itemを再試行するPowershellスクリプト

分類Dev

Firebaseキュー-再試行が機能していませんか?

分類Dev

RXJSオブザーバーは機能ではなく再試行します

分類Dev

再試行のための既存の機能的な方法-Scalaまで?

分類Dev

Java-再描画が機能しない

分類Dev

Beautifulsoup:findAll再帰が機能しない

分類Dev

JTabbedPaneの再描画が機能しない

分類Dev

再帰検索が機能しない

分類Dev

再描画方法が機能しない

分類Dev

MarkerWithLabelが再び機能しない

分類Dev

再帰関数が機能しない

分類Dev

javax の再描画が機能しない

Related 関連記事

  1. 1

    RestControllerでSpringの再試行が機能しない

  2. 2

    Spring Integration + SQS-例外での再試行が機能しない

  3. 3

    RxJSを再試行してから、catchErrorが機能しない

  4. 4

    再試行機能が3カウントを超えて機能しない

  5. 5

    karatedslの再試行機能が機能していません

  6. 6

    WorkManagerの再試行が機能しない

  7. 7

    リボン再試行構成が機能しない

  8. 8

    SpringBatch-beforeJobが機能していないようです

  9. 9

    bigqueryで更新を再試行しても機能しないようです

  10. 10

    再試行可能な注釈が春のバッチアプリケーションで機能しない

  11. 11

    Spring再試行テンプレートが@ org.springframework.transaction.annotation.Transactionalで機能しない

  12. 12

    C#-Selenium-再試行属性がSeleniumタイムアウトで機能しない

  13. 13

    AzurePython関数の再試行制限がロジックアプリで機能しない

  14. 14

    AzurePython関数の再試行制限がロジックアプリで機能しない

  15. 15

    接続切断が機能しない場合は再試行してください

  16. 16

    PHPDISTINCTが2行で機能しない

  17. 17

    pipが機能しない、TTPSConnectionPool(host = 'pypi.org'、port = 443):最大再試行回数を超えました

  18. 18

    成功が機能しなくなるまでmove-itemを再試行するPowershellスクリプト

  19. 19

    Firebaseキュー-再試行が機能していませんか?

  20. 20

    RXJSオブザーバーは機能ではなく再試行します

  21. 21

    再試行のための既存の機能的な方法-Scalaまで?

  22. 22

    Java-再描画が機能しない

  23. 23

    Beautifulsoup:findAll再帰が機能しない

  24. 24

    JTabbedPaneの再描画が機能しない

  25. 25

    再帰検索が機能しない

  26. 26

    再描画方法が機能しない

  27. 27

    MarkerWithLabelが再び機能しない

  28. 28

    再帰関数が機能しない

  29. 29

    javax の再描画が機能しない

ホットタグ

アーカイブ