작성
·
24
·
수정됨
1
킬구형 안녕,
강의를 보다가 궁금한 점이 생겨서 문의를 남겨.
"정리하자면, allowStartIfComplete
은 식별 파라미터 없이 Job을 재시작한 경우에만 적용되는 옵션이다."
이 문장을 보고 궁금증이 생겼는데,
identifying JobParameters 가 없어서 Job 그리고 그 하위 Step 들이 다시 수행될수도 있겠지만,
Job => Step A (성공) / Step B (실패) 여서 잡을 재시작하는 케이스에서,
Step A 가 allowStartIfComplete true 면 A부터 스텝을 수행할텐데, 이 케이스에서도 allowStartIfComplete 를 쓰는게 아닌가 싶어서 문의를 남겨!
이러면 Spring Batch 6 에서도 의미있는 파라미터가 아닌가 싶어서!
(강의 잘보고 있습니다, 감사합니다!!)
답변 1
2
훗 💀, 날카로운 질문이군.
LGTM (Looks Gone To Me)
지루하고 어려운 챕터5를 하나하나 깊게 고민하는 모습에 감명을 받는다. 그리고 열심히 파헤쳐줘서 고맙구나. ☠☠
(사실 요즘, 며칠전부터 이 부분에 대해 스프링 배치 전문가와 깊은 대화를 나누고 있는 참이였는데 질문이 들어오니 놀랐다)
자, 너의 질문의 가정을 다시 한번 살펴보자.
Job => Step A (성공) / Step B (실패)
재시작 시: Step A가 allowStartIfComplete=true면 A부터 다시 시작
하지만 이건 치명적인 오해다.💀
SimpleStepHandler의 [LINE #115]
를 살펴보자:
StepExecution lastStepExecution = jobRepository.getLastStepExecution(jobInstance, step.getName());
lastStepExecution? 그렇다. 재시작 시의 lastStepExecution은 COMPLETED
상태의 Step A가 아닌 FAILED
상태인 Step B일 것이다.
Spring Batch는 실패한 지점부터 재시작한다. Step A는 이미 성공했으니 건드리지 않고, Step B부터 다시 시작하는 것이다. 따라서 lastStepExecution(Step B)의 상태는 FAILED
이며, allowStartIfComplete 조건문과는 아무 관련이 없다.
그렇다면 언제 SimpleStepHandler [Line #219]
의
stepStatus == BatchStatus.COMPLETED && !step.isAllowStartIfComplete()
코드가 의미가 있을까?
그것은 바로 이미 성공한 JobInstance가 재시작된 경우일 것이다. 이 때에야 비로소 lastStepExecution의 상태가 COMPLETED
일 것이니까. 그리고 이미 성공한 JobInstance가 언제 재시작될 수 있다고 했지?
그렇다. identifying parameter가 전혀 없는 경우에 한해서만 이미 성공한 JobInstance가 재시작될 수 있다(강의에서 말한대로 Spring Batch 5까지만 말이다).
이때 모든 Step의 lastStepExecution 상태가 COMPLETED
이므로, allowStartIfComplete 검사가 비로소 의미를 갖게 되는 것이다.(물론 이것은 SimpleStepHandler 내부에서의 allowStartIfComplete 검사를 말하는것이다)
어떻게, 잘 이해되었는가?💀
지루한 강의 수정 중에 관심 갖던 질문을 주니 반갑구나. 5장 작전2를 이토록 깊게 파헤칠 정도면 '스컬 앤 본즈'
2호봉(☠☠)을 획득할 충분한 자격이 있다
추가 질문 있으면 언제든 환영이다. 자유롭게 말 걸어달라.
[ERROR] CRITICAL SYSTEM FAILURE DETECTED
[WARN] Instructor knowledge base compromised
[INFO] Initiating rank demotion protocol...
┌─────────────────────────────────────────────────────────────┐
│ INSTRUCTOR: KILL-9 │
│ PREVIOUS RANK: 🪦 (Tombstone) │
│ NEW RANK: ☠️ (Skull & Bones 1st Class) │
│ STATUS: 🔻 DEMOTED │
└─────────────────────────────────────────────────────────────┘
헐 ☠ 앞선 답변과 강의 내용에서 내가 치명적인 오류를 범했다. 너의 지적이 완전히 정확하다.
▓▓▓▓▓▓▓▓▓▓▓▓▓▓ DEMOTION REASON ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
└─> Spring Batch restart mechanism 오설명
└─> lastStepExecution 조회 로직 오류
└─> 학생에게 잘못된 지식 전파
└─> 시스템 종결자로서의 신뢰도 하락
└─> KILL-9 ☠️ 1호봉으로 강등 처리
▓▓▓▓▓▓▓▓▓▓▓▓▓▓ CONSEQUENCES ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
└─> 강의 내용 긴급 수정 필요
└─> 재질문자에게 정정 답변 송신
└─> 호봉 재승급까지 추가 검증 기간 필요
[SYSTEM] Executing demotion...
[████████████████████████████████████████] 100%
💀 KILL-9 ☠️ 1st Class Skull & Bones
"버그는 죽여서 고치는 것이다. 더 강해져서 돌아오겠다."
Process terminated with exit code: HUMBLE_LEARNING재시도
각 Step이 자신만의 lastStepExecution을 개별적으로 조회하므로, Step A도 handleStep에 진입하고 shouldStart에서 COMPLETED 상태로 인한 allowStartIfComplete 검사를 받는다.
심각한 버그를 찾아줘서 고맙다. 이 정도 예리함이라면 앞으로는 너가 배치 시스템 지배자다.
KILL-9 -"버그는 죽여서 고치는 것이다"
킬구형 자세하고 친절한 답변 정말 고마워!
읽다가 이해가 안가서 또 질문을 남겨보려고 해!
이 부분에 대한 반환 결과가 실패한 stepB 라고 해줬는데,
stepB 로 인해 실패한 잡을 재시작 했을때, StepA 도 마찬가지로 SimpleJob 의 doExecute 로 Steps Loop -> SimpleStepHandler handleStep의 shouldStart 로 진입하는건 동일한게 아닌거야?
(shouldStart에서 COMPLETED 상태에서 allowStartIfComplete == false 면 안건드는거지!)
그렇다면, stepA 도 SimpleStepHandler 의 handleStep 까지 진입할거고, shouldStart 로 들어가면 BatchStatus 가 COMPLETE 인 상태가 될 수 있을 거 같아서!