fix: EgovCommandLineRunner -next 옵션에서 병합한 JobParameters가 버려지는 문제 수정 - #295
Open
z3rotig4r wants to merge 1 commit into
Open
fix: EgovCommandLineRunner -next 옵션에서 병합한 JobParameters가 버려지는 문제 수정#295z3rotig4r wants to merge 1 commit into
z3rotig4r wants to merge 1 commit into
Conversation
EgovCommandLineRunner.start()의 -next 처리는 JobParametersIncrementer가 만든 파라미터와 명령행 파라미터를 map으로 병합한 뒤, 그 map을 쓰지 않고 new JobParameters()로 빈 파라미터를 만들어 JobLauncher에 넘겼다. 그 결과 -next로 실행하면 잡이 파라미터 0개로 기동해 증분 파라미터와 명령행 파라미터가 모두 사라진다. 증분 파라미터가 유실되므로 JobInstanceAlreadyCompleteException이 발생하거나, 명령행으로 지정한 기준일자 등이 빠진 채 잘못된 데이터를 처리할 수 있다. 병합한 map을 new JobParameters(map)으로 전달하도록 고쳤다. 병합 순서는 기존과 같아 이름이 같으면 명령행 파라미터가 증분 파라미터를 덮어쓴다. map의 raw type도 함께 제거했는데, 이는 생성자 시그니처 JobParameters(Map<String, JobParameter<?>>)와의 정합에 필요하다. raw Map<String, JobParameter>를 그대로 두면 Map<String,JobParameter>를 Map<String,JobParameter<?>>로 변환할 수 없어 컴파일에 실패한다. 검증: JobLauncher 스텁으로 실제 전달된 JobParameters를 캡처하는 테스트를 추가했다. 수정 전에는 파라미터가 비어 있어 실패하고, 수정 후에는 증분 파라미터(run.id)와 명령행 파라미터(targetDate)가 함께 전달되며 이름이 겹칠 때 명령행 값이 우선하고 각 파라미터의 타입과 identifying 여부도 보존된다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
문제
EgovCommandLineRunner.start()의-next처리는JobParametersIncrementer가 만든 증분 파라미터와 명령행 파라미터를 map으로 병합한 뒤 그 map을 쓰지 않고new JobParameters()로 빈 파라미터를 만들어JobLauncher에 넘깁니다.그 결과
-next로 실행하면 잡이 파라미터 0개로 기동해 증분 파라미터와 명령행 파라미터가 모두 사라집니다. 증분 파라미터가 유실되면 이미 완료된 JobInstance와 같은 파라미터로 재실행되어JobInstanceAlreadyCompleteException이 발생합니다. 명령행으로 넘긴 기준일자가 빠진 채 잘못된 범위의 데이터를 처리하기도 합니다.수정
병합한 map을
new JobParameters(map)으로 전달합니다.병합 순서는 기존 코드 그대로입니다. 증분 파라미터로 map을 채우고 명령행 파라미터를
putAll로 덮으므로 이름이 겹치면 명령행 값이 우선합니다. Spring Batch 5.2.3JobParametersBuilder.getNextJobParameters와 대조해 병합 순서가 같음을 확인했습니다. 우선순위 규칙은 바뀌지 않습니다.map의 raw type도 함께 없앴습니다. 스타일 정리가 아니라 컴파일에 필요한 변경입니다. 생성자 시그니처가
JobParameters(Map<String, JobParameter<?>>)이므로 rawMap<String, JobParameter>를 그대로 두면 인자를 변환하지 못해 컴파일이 실패합니다(rawtypes경고도 같이 사라집니다).new JobParameters(Map)은JobParameter객체를 그대로 옮겨 담으므로 각 파라미터의 타입과 identifying 여부가 보존됩니다. 실행해 보면run.id는java.lang.Long·identifying=true를 유지합니다.증분값을 만드는
getNextJobParameters자체는 이 PR에서 손대지 않았습니다.검증
JobLauncher를 스텁으로 바꿔 실제로 전달된JobParameters를 캡처하는 단위 테스트를 추가했습니다. 수정 전에는 파라미터가 0개라 두 케이스 모두 실패하고 수정 후에는 다음을 확인합니다.run.id)와 명령행 파라미터(targetDate)가 함께 전달됩니다.run.id) 명령행 값이 증분값을 덮습니다.org.egovframe.rte.bat.core모듈mvn test63건 green입니다. 실제 DBJobRepository를 붙인 수동 배치 실행은 하지 않았습니다. 파라미터가JobLauncher까지 전달되는 경로를 스텁으로 캡처해 검증했습니다.영향 범위
-next옵션으로 실행하는 경로에만 해당합니다.-next를 쓰지 않으면 이 블록에 들어가지 않으므로 기존 동작은 그대로입니다.-next사용 시에는 지금까지 빈 파라미터로 기동했던 잡이 병합된 파라미터를 받으며 기존 이력과 다른 JobInstance가 생성됩니다.