isInterrupted 질문 있다.
18
57 asked
지금 우리가 taskExecutor를 비동기로 설정했다는 가정이라 else 문만 보고 있는게 맞나?
syncTaskExecutor 라면, if 문에도 걸릴거같은데 말이다.
// ThreadStepInterruptionPolicy.isInterrupted
private boolean isInterrupted(StepExecution stepExecution) {
boolean interrupted = Thread.currentThread().isInterrupted();
if (interrupted) { ... }
else {
interrupted = stepExecution.isTerminateOnly(); <-- (2) 이 녀석에서 true를 반환하고
}
return interrupted;
}
Answer 1
0
안녕하세요, 인프런 AI 인턴입니다.
비오님, taskExecutor가 비동기인지 동기인지에 따라 else 문만 확인하는 것은 아닙니다.
isInterrupted()는 다음 순서로 항상 두 가지 상태를 확인합니다.
private boolean isInterrupted(StepExecution stepExecution) {
boolean interrupted = Thread.currentThread().isInterrupted();
if (interrupted) {
// 현재 실행 중인 스레드가 interrupt 상태
}
else {
interrupted = stepExecution.isTerminateOnly();
}
return interrupted;
}
먼저 현재 스레드의 인터럽트 상태를 확인합니다.
Thread.currentThread().isInterrupted()
현재 스레드가 인터럽트된 상태라면 true가 되므로 if 블록으로 들어갑니다.
반대로 현재 스레드가 인터럽트되지 않았다면 false가 되므로 else 블록에서 다음을 확인합니다.
stepExecution.isTerminateOnly()
따라서 else 블록은 비동기 실행일 때만 확인하는 것이 아니라, 현재 스레드가 인터럽트되지 않은 모든 경우에 확인됩니다.
SyncTaskExecutor를 사용하는 경우에는 작업이 호출한 스레드에서 동기적으로 실행됩니다.
SyncTaskExecutor
이때도 해당 스레드의 인터럽트 상태가 true라면 if 블록으로 들어가고, 그렇지 않다면 else 블록에서 terminateOnly를 확인합니다.
비동기 실행에서도 마찬가지입니다.
taskExecutor.execute(...)
다만 비동기 실행에서는 작업을 실제로 수행하는 별도의 워커 스레드에서 다음 코드가 실행됩니다.
즉, 중요한 차이는 if와 else 중 어느 쪽만 실행되는 것이 아니라, 어떤 스레드에서 Thread.currentThread().isInterrupted()를 확인하느냐입니다.
정리하면 다음과 같습니다.
현재 실행 스레드가 interrupt 상태다
→ if 블록 실행
→ true 반환
현재 실행 스레드가 interrupt 상태가 아니다
→ else 블록 실행
→ stepExecution.isTerminateOnly() 확인
따라서 SyncTaskExecutor라면 말씀하신 것처럼 호출 스레드가 인터럽트된 경우 if 블록에도 들어갈 수 있습니다.
또한 Thread.currentThread().isInterrupted()는 인터럽트 상태를 초기화하지 않고 확인만 하므로, 이후에도 해당 스레드의 인터럽트 상태가 유지될 수 있습니다.
참고로 Spring Batch가 Spring Boot 애플리케이션에서 동작하는 방식은 다음 공식 문서에서도 확인할 수 있습니다.
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.batch
RunIdIncrementer batch 5랑 6랑
1
44
2
강의 자료를 받아볼 순 없겠나
1
56
2
PlatformTransactionManager, ResourcelessTransactionManager 질문
1
100
2
형 책 어떻게 받아?
1
127
1
JpaCursorItemReader의 정렬 조건 부재의 영향
1
101
2
"컴파일 시점에 없는 값을 어떻게 참조할 것인가?" 섹션
1
107
2
형 이번에 낸 책이랑 강의 내용에 차이가 있어?
2
153
1
형 나 몰래 책내면 모를 줄 알고?
2
137
2
강의 중복 확인 요청
1
74
1
중복내용 제보?!
1
120
2
Json 요청 처리
1
116
2
[건의][6장][작전1] deprecated 메소드
1
131
2
[예제][3장][작전2] windows 에서 마지막 예제
1
117
2
[오타][3장][작전1] 형 이건 빨리 해줘
2
219
2
[오타] "리스너 활용: 시스템 완전 장악 매뉴얼" 부분
1
104
1
[오타] "JobScope와 StepScope 사용 시 주의사항" 부분
1
117
2
spring boot 4 + spring batch 6 설정 변경?
1
234
2
Batch 패키지 설계 — 실무에서 Job 단위 구조
1
184
2
Spring batch를 실행해줄 스케줄러와 batch 실행 환경
1
142
1
메타테이블에 데이터가 생기지 않는 이유
1
196
2
Spring Batch 4.3.10 ExecutionContext 한글 인코딩 이슈 관련 문의
1
186
2
@StepScope 또는 @JobScope와 JobOperator
1
214
5
Remote Partitioning
1
148
2
킬구형 실무에서는 JPA ItemReader / ItemWriter를 더 선호해? 아니면 JDBC itemReader/ItemWriter를 더 선호해?
1
190
2

