2021. 4. 12. 16:21ㆍspring
가. 개요
Spring Batch가 제공하는 ExecutionContext는 두개가 있다.
- Job 의 ExecutionContext (이하 JobExecutionContext)
- Step의 ExecutionContext (이하 StepExecutionContext)
둘은 같은 기능이나, 적용범위가 다르다.
나. Execution Context 의 개념
- Job에서 사용하는 데이터를 보관하는 보관소이다.
- ExecutionContext 클래스
ㄱ.
Job처리를 통해서 언제나 참조 가능한 데이터를 보존. 추가 및 갱신도 가능.
통상 step처리의 결과 (결과값 등)를 다음 Step에 전달하는 것은 불가능하다. 그러나 JobExecutionContext에 저장해서 어떤 step에서도 참조 가능하게 할 수 있다.
ㄴ.
Step 내 처리에서 데이를 참조, 추가, 갱신이 자유롭게 가능하다.
JobExecutonContext와 달리, 다른 step에서 참조가 불가능하다.
chunk 처리등에서 도중에 에러 종료로 끝난 경우 어디까지 데이터를 읽어 들어드렸는지를 stepExecutionContext에 보관해놓아도 다음 step재처리에서 실패했던 곳에서부터 처리를 재처리 가능하다.
SpringBatch에서 제공하는 chunk관련 클래스 (ItemReader 클래스)은 이미 그 기능이 들어가 있어 리스타트가 가능하다.
다. StepExecutionContext의 사용방법
- StepExecutionListener 메소드 사례
[호출처, 데이터 등록]
@Override
public void beforeStep(StepExecution se) {
this.stepExecution = se;
ExecutionContext context = se.getExecutionContext();
context.put("count", 12);
}
[데이터 취득]
//타입을 명시적으로 지정
int count = context.getInt("count", 0);
//타입을 미지정
count = (Integer)context.get("count");
{"map":
{"entry":[
{"string":"FlatFileItemWriter.current.count","long":106},
{"string":"FlatFileItemWriter.written","long":5},
{"string":"FlatFileItemReader.read.count","int":6}
]}
}
라. ExecutionContext 작동원리
ExecutionContext에 저장되는 정보가 POJO형태라면 보관이 될 수 있다.
Xstream 프레임워크를 이용해서 JSON형식으로 변환(시리얼라이즈)하여 json문자열을 DB에 보관하고 있다.
Spring Batch의 DB 테이블 중 batch_step_execution_context 테이블에 Json에 변환해 문자열로 저장
[변환후 Json 문자열의 이미지]
{"map":
{"entry":[
{"string":"FlatFileItemWriter.current.count","long":106},
{"string":"FlatFileItemWriter.written","long":5},
{"string":"FlatFileItemReader.read.count","int":6}
]}
}
마. 주의점
- Json 형태로 저장되는 컬럼은 2500바이트로 이것을 초과하는 데이터는 저장이 되지 않음.
- Xstream으로 JSON형태로 변환 되지않는 자바 오브젝트는 보관되지 않는다.
- 특히 JobExecutionContex는 Step 처리 결과를 다른 step에 공유할수 있는 유일한 방법이어서 사이즈가 큰 데이터를 저장하는 경향이 있는데, 그러면 위의 이유로 오작동을 초래한다.
- 원칙적으로 step 내 처리에서 완경하여 다음 step에 결과를 전달하지않아도 좋게 설계를 해야한다.
바. 마무리
- ExecutionContex는 StepExecution으로 부터 취득 가능.
- StepExecution은 대개 Listener로부터 취득.
- JobExecution은 stepExecution.getJobExecution() 으로 취득 가능.
'spring' 카테고리의 다른 글
06. spring batch - 스프링 배치 처리 샘플 (chunk 처리 : 파일 읽기) (0) | 2021.04.13 |
---|---|
05. Spring배치 사용준비 (0) | 2021.04.12 |
03. Spring Batch 기본개념 (기동, 기동 옵션) (0) | 2021.04.12 |
02. Spring Batch 기본개념 (JobInstance) (0) | 2021.04.12 |
01. Spring Batch 개념 - Step (0) | 2021.04.09 |