π Spring Batch Retry (Tasklet κΈ°λ°)
μμ μ½λλ κΉνλΈμμ νμΈν μ μμ΅λλ€ :)
μλΉμ€μμ μ¬μλκ° νμν κ²½μ°λ μΈμ μΌκΉμ? λΉμ¦λμ€ λ‘μ§ μ€λ₯μ κ°μ λ΄κ° μμ±ν μ ν리μΌμ΄μ μ μν΄ λ°μν μλ¬λ μ¬μλλ₯Ό νλλΌλ λμΌνκ² μ€ν¨ν κ²½μ°κ° ν½λλ€.
νμ§λ§ λ€νΈμν¬μ κ°μ μΌμμ μΌλ‘ λ°μν μ μλ μ₯μ μν©μμλ μ μ©νκ² μ¬μ©ν μ μμ΅λλ€.
λνμ μΌλ‘λ λ°μ΄ν°λ² μ΄μ€ I/Oμμ νμμμ, API νΈμΆ μ λ°μνλ νμμμ λ±μ΄ μκ² λ€μ.
μ΅κ·Ό μ¬λ΄μμ μΈλΆ APIλ₯Ό νΈμΆνλ κ³Όμ μμ κ°νμ μΌλ‘ μλμ κ°μ μμΈκ° λ°μνμ΅λλ€.
reactor.core.Exceptions$ReactiveException: io.netty.channel.unix.Errors$NativeIoException: readAddress(..) failed: μ°κ²°μ΄ μλνΈμ μν΄ λμ΄μ§
μ΅κ·Όμ κ°μκΈ° λ°μν μΌμ΄μ€λ‘ μμ§ μ νν μμΈμ νμ νμ§ λͺ»νμ§λ§, ν΄λΉ APIλ₯Ό μ¬μ²λ¦¬νλ©΄ 2~3ν μλ ν μ μ μ²λ¦¬κ° λ©λλ€.
ν΄λΉ APIλ₯Ό νΈμΆνλ νλ‘μ νΈλ Spring Batch νλ‘μ νΈλ‘ Chunk Orientedκ° μλ Tasklet κΈ°λ°μΌλ‘ Jobμ΄ μ΄λ£¨μ΄μ Έμμ΅λλ€.
λ°λΌμ Tasklet κΈ°λ° Batchμμλ Retry κΈ°λ₯μ ꡬννλ λ°©λ²μ λν΄ κ°λ΅ν μ΄ν΄λ΄ λλ€.
RetryOperations, RetryTemplate
Retry κΈ°λ₯μ Spring Batch 2.2 λ²μ λΆν° μ μΈλμ΄μ νμ¬λ Spring retry λΌμ΄λΈλ¬λ¦¬μ μ‘΄μ¬νλλ°μ, μ΄λ retry κΈ°λ₯μ΄ μ€νλ§μ λ€λ₯Έ νλ μμν¬μλ μ μ©ν κΈ°λ₯μ΄κΈ° λλ¬Έμ Batchκ° μλ spring λΌμ΄λΈλ¬λ¦¬μ ν¬ν¨λμλ€κ³ ν©λλ€.
The ability to retry an operation via the RetryTemplate has always been a feature of Spring Batch. That ability has been identified as a useful feature for other frameworks (Spring Integration for example). With the 2.2.0 release, the retry logic has been extracted from Spring Batch into it's own library called Spring Retry. With this change, there are two main impacts. The first is that the majority of the
org.springframework.batch.retry package has been moved into this new library. With that move, the package name has also dropped the batch to become org.springframework.retry
https://docs.spring.io/spring-batch/docs/2.2.x/reference/html/whatsNew.html
Spring Retryλ μ΅μμ RetryOperations μΈν°νμ΄μ€κ° μ‘΄μ¬νκ³ , ꡬνμ²΄μΈ RetryTemplate ν΄λμ€κ° μ‘΄μ¬ν©λλ€.
RetryTemplate ν΄λμ€μμ μ¬μλ μ΅λ νμ, μ¬μλ κ°κ²©, Listeners, μ¬μλ μ²λ¦¬ν μμΈ μ€μ λ±μ μ§μ ν μ μμ΅λλ€.
RetryConfig
RetryTemplateμ BeanμΌλ‘ λ±λ‘νμ¬ μ¬μλ ν νμ, κ°κ²©, μμΈ ν΄λμ€ λ±μ μ€μ ν©λλ€.
custom λ©μλλ₯Ό μ¬μ©νλ , μ§μ κ°μ μ€μ νλ maxAttemptsμ κ°μ λ©μλλ₯Ό μ¬μ©νλ ν¬κ² μκ΄μ μμ΅λλ€.
(μ¬μλ κΈ°λ³Έ νμ: 3, μ¬μλ κΈ°λ³Έ κ°κ²©: 1μ΄)
retryOn() λ° notRetryOn() λ©μλλ νλλ§ μ¬μ©μ νλΌκ³ ν©λλ€.
(retryOn() λ©μλμ notRetryOn() λ©μλμ λμΌν μμΈλ₯Ό μ€μ νλ κ²½μ° λ±μ κ³ λ €νμ¬ νλμ λ©μλλ§ μ¬μ©ν΄μΌ νλ κ²μ΄ μλμ§ μ‘°μ¬μ€λ μκ°ν΄ λ΄ λλ€.. π§)
Spring Batch Job
Jobμμ RetryTemplateμ μ£Όμ λ°κ³ , μ€μ λ‘μ§μ μ²λ¦¬νλ Taskletμμ execute() λ©μλλ₯Ό ν΅ν΄ μ¬μλ κΈ°λ₯μ ꡬνν©λλ€.
RetryTemplateμλ μ¬λ¬ κ°μ execute() λ©μλκ° μ‘΄μ¬ν©λλ€.
μ λ λ λ²μ§Έ RetryCallback, RecoveryCallbackλ₯Ό μΈμλ‘ λ°λ λ©μλλ₯Ό μ¬μ©νκ³ , μ λ©μλλ€μ λͺ¨λ doExecute() λ©μλλ₯Ό νΈμΆμ νλλ°μ, μ΄ λ©μλκ° μ€μ λ‘ μ¬μ²λ¦¬κ° μ΄λ£¨μ΄μ§λ κ³³μ λλ€.
μ€μ retry λ‘μ§μ΄ μ€νλλ RetryTemplateμ doExecute() λ©μλμΈλ°μ, λμ κ³Όμ μ λ€μκ³Ό κ°μ΅λλ€.
(λ©μλκ° κΈΈμ΄μ ν΅μ¬ λ‘μ§μ μ μΈν μ½λλ μΌλΆ μ κ±°νμμ΅λλ€.)
- μ¬μλκ° κ°λ₯ν λμ λ°λ³΅μ μ€ν
- μ¬μλ μ²λ¦¬
- 2)μμ μ¬μλ μ²λ¦¬ ν μμΈκ° λ°μν κ²½μ°, lastException μ€μ λ° μ¬μλ νμ(count) + 1 μ¦κ°
- backOffλ₯Ό μν΄ μ¬μλκ° κ°λ₯νμ§ λ€μ νμΈ
- μ¬μλ κ°κ²© backOff
- μ¬μλ μ΅λ νμ μλ ν μ€ν¨μΈ κ²½μ° Recover λ‘μ§ μν
Spring Batch Job Test
Jobμ μ€νν΄ λ³΄λ©΄ 1μ΄ κ°κ²©μΌλ‘ μ¬μλκ° λκ³ , maxAttemptμΈ 3ν μλ ν μ€ν¨ν κ²½μ° Recover λ‘μ§μ΄ μνμ΄ λ©λλ€.
@Retryable λ° Chunk Oriented Retry
Retryλ₯Ό ꡬννλ λ€λ₯Έ λ°©λ²μΌλ‘ μ΄λ Έν μ΄μ κ³Ό Chunk κΈ°λ° μ μ©νλ λ°©λ²μ΄ μ‘΄μ¬ν©λλ€.
1. @Retryable
@Retryableμ μΈλΆ λΌμ΄λΈλ¬λ¦¬ μΆκ° λ° @Retryable μ΄λ Έν μ΄μ κ³Ό μ€μ νμΌμ @EnableRetryλ§ μ μΈνλ©΄ λμ λλ€.
(μ°Έκ³ : https://www.baeldung.com/spring-retry)
2. Chunk Oriented Retry
Chunk κΈ°λ° Batchμμλ Retryλ λ§€μ° κ°λ¨νκ² μ μ©μ΄ κ°λ₯ν©λλ€.
(μ°Έκ³ : https://www.baeldung.com/spring-batch-retry-logic)
'Spring > Spring Batch' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Spring Batch (11) Repeat (0) | 2023.01.15 |
---|---|
Spring Batch (10) @JobScope, @StepScope (0) | 2022.12.08 |
Spring Batch (9) JobParametersValidator (0) | 2022.11.13 |
Spring Batch (8) JobLauncher (0) | 2022.11.11 |
Spring Batch (7) JobRepository (0) | 2022.11.08 |
λκΈ