Spring Batch에서 스킵 로직 구성

1. 소개

기본적으로 Spring Batch 작업 처리 중에 발생한 오류는 해당 단계를 실패하게 만듭니다. 그러나 특정 예외에 대해 현재 처리 된 항목을 건너 뛰고 싶은 상황이 많이 있습니다.

이 튜토리얼에서는 Spring Batch 프레임 워크에서 스킵 로직을 구성하는 두 가지 접근 방식을 살펴 봅니다.

2. 사용 사례

예제의 목적을 위해 Spring Batch 소개 기사에 이미 제시된 간단한 청크 지향 작업을 재사용 할 것입니다.

이 작업은 일부 재무 데이터를 CSV에서 XML 형식으로 변환합니다.

2.1. 입력 데이터

먼저 원본 CSV 파일에 몇 개의 행을 추가해 보겠습니다.

username, user_id, transaction_date, transaction_amount devendra, 1234, 31/10/2015, 10000 john, 2134, 3/12/2015, 12321 robin, 2134, 2/02/2015, 23411 , 2536, 3/10/2019, 100 mike, 9876, 5/11/2018, -500 , 3425, 10/10/2017, 9999

보시다시피 마지막 3 개 행에는 잘못된 데이터가 포함되어 있습니다. 5 행과 7 행에는 사용자 이름 필드가 누락되었으며 6 행의 거래 금액은 음수입니다.

이후 섹션에서는 이러한 손상된 레코드를 건너 뛰도록 일괄 작업을 구성합니다.

3. 건너 뛰기 제한 및 건너 뛸 수있는 예외 구성

3.1. 사용 스킵skipLimit을

이제 실패시 항목을 건너 뛰도록 작업을 구성하는 두 가지 방법 중 첫 번째 방법 인 skipskipLimit 메소드에 대해 설명 하겠습니다 .

@Bean public Step skippingStep( ItemProcessor processor, ItemWriter writer) throws ParseException { return stepBuilderFactory .get("skippingStep") .chunk(10) .reader(itemReader(invalidInputCsv)) .processor(processor) .writer(writer) .faultTolerant() .skipLimit(2) .skip(MissingUsernameException.class) .skip(NegativeAmountException.class) .build(); }

우선, 건너 뛰기 기능을 활성화 하려면 단계 구축 프로세스 중에 faultTolerant () 호출을 포함해야합니다 .

skip ()skipLimit () 내에서 건너 뛰려 는 예외와 건너 뛴 항목의 최대 수를 정의합니다.

위의 예에서 MissingUsernameException 또는 NegativeAmountException 이 읽기, 처리 또는 쓰기 단계에서 발생하면 현재 처리 된 항목이 생략되고 총 제한 2 개에 대해 계산됩니다.

따라서 세 번째 예외가 발생하면 전체 단계가 실패 합니다.

3.1. noSkip 사용

이전 예에서 MissingUsernameExceptionNegativeAmountException 이외의 다른 예외로 인해 단계가 실패합니다.

그러나 일부 상황에서는 단계를 실패하고 다른 단계를 건너 뛸 예외식별하는 것이 더 적절할 수 있습니다 .

skip , skipLimitnoSkip을 사용하여이를 구성하는 방법을 살펴 보겠습니다 .

@Bean public Step skippingStep( ItemProcessor processor, ItemWriter writer) throws ParseException { return stepBuilderFactory .get("skippingStep") .chunk(10) .reader(itemReader(invalidInputCsv)) .processor(processor) .writer(writer) .faultTolerant() .skipLimit(2) .skip(Exception.class) .noSkip(SAXException.class) .build(); }

위의 구성으로 Spring Batch 프레임 워크에 SAXException을 제외한 모든 예외 (구성된 제한 내) 를 건너 뛰도록 지시 합니다. 이는 SAXException이 항상 단계 실패를 유발 함을 의미 합니다.

skip ()noSkip () 호출 의 순서는 중요하지 않습니다.

4. 사용자 지정 SkipPolicy 사용

때로는 더 정교한 건너 뛰기 검사 메커니즘이 필요할 수 있습니다. 이를 위해 Spring Batch 프레임 워크는 SkipPolicy 인터페이스를 제공합니다 .

그런 다음 자체 스킵 로직 구현을 제공하고이를 단계 정의에 연결할 수 있습니다.

앞의 예를 염두에두고 두 항목의 건너 뛰기 제한을 정의하고 MissingUsernameExceptionNegativeAmountException 만 건너 뛸 수 있도록 만들고 싶다고 가정 합니다.

그러나 추가 제약은 NegativeAmountException 을 건너 뛸 수 있지만 양이 정의 된 한도를 초과하지 않는 경우에만 가능하다는 것 입니다.

커스텀 SkipPolicy를 구현해 보겠습니다 .

public class CustomSkipPolicy implements SkipPolicy { private static final int MAX_SKIP_COUNT = 2; private static final int INVALID_TX_AMOUNT_LIMIT = -1000; @Override public boolean shouldSkip(Throwable throwable, int skipCount) throws SkipLimitExceededException { if (throwable instanceof MissingUsernameException && skipCount < MAX_SKIP_COUNT) { return true; } if (throwable instanceof NegativeAmountException && skipCount < MAX_SKIP_COUNT ) { NegativeAmountException ex = (NegativeAmountException) throwable; if(ex.getAmount() < INVALID_TX_AMOUNT_LIMIT) { return false; } else { return true; } } return false; } }

이제 단계 정의에서 사용자 지정 정책을 사용할 수 있습니다.

 @Bean public Step skippingStep( ItemProcessor processor, ItemWriter writer) throws ParseException { return stepBuilderFactory .get("skippingStep") .chunk(10) .reader(itemReader(invalidInputCsv)) .processor(processor) .writer(writer) .faultTolerant() .skipPolicy(new CustomSkipPolicy()) .build(); }

그리고 이전 예제와 마찬가지로 여전히 faultTolerant () 를 사용하여 건너 뛰기 기능을 활성화 해야 합니다.

그러나 이번에는 skip () 또는 noSkip ()을 호출하지 않습니다 . 대신 skipPolicy () 메서드를 사용하여 자체적 인 SkipPolicy 인터페이스 구현을 제공합니다 .

보시다시피이 접근 방식은 더 많은 유연성을 제공하므로 특정 사용 사례에서 좋은 선택이 될 수 있습니다 .

5. 결론

이 자습서에서는 Spring Batch 작업을 내결함성으로 만드는 두 가지 방법을 제시했습니다.

skipLimit ()skip ()noSkip () 메소드 와 함께 사용하는 것이 더 많이 사용되는 것처럼 보이지만 상황에 따라 사용자 정의 SkipPolicy 를 구현하는 것이 더 편리 하다는 것을 알 수 있습니다.

평소와 같이 모든 코드 예제는 GitHub에서 사용할 수 있습니다.