작성
·
672
0
답변 1
0
네
Job 을 비동기식으로 실행한다는 의미는 Job 의 시작부터 종료까지 포함한 모든 작업을 별도의 스레드에서 실행한다는 의미입니다.
(new Runnable() {
@Override
public void run() {
try {
if (logger.isInfoEnabled()) {
logger.info("Job: [" + job + "] launched with the following parameters: [" + jobParameters
+ "]");
}
job.execute(jobExecution);
if (logger.isInfoEnabled()) {
Duration jobExecutionDuration = BatchMetrics.calculateDuration(jobExecution.getStartTime(), jobExecution.getEndTime());
logger.info("Job: [" + job + "] completed with the following parameters: [" + jobParameters
+ "] and the following status: [" + jobExecution.getStatus() + "]"
+ (jobExecutionDuration == null ? "" : " in " + BatchMetrics.formatDuration(jobExecutionDuration)));
}
}
catch (Throwable t) {
if (logger.isInfoEnabled()) {
logger.info("Job: [" + job
+ "] failed unexpectedly and fatally with the following parameters: [" + jobParameters
+ "]", t);
}
rethrow(t);
}
}
private void rethrow(Throwable t) {
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
}
else if (t instanceof Error) {
throw (Error) t;
}
throw new IllegalStateException(t);
}
});
}
위 구문에서
job.execute(jobExecution);
구문은 메인 스레드가 아닌 taskExecutor 에서 생성한 다른 스레드가 실행하고 있습니다.
그렇기 때문에 메인스레드가 taskExecutor.execute() 를 실행한 즉시 다음 처리가 이루어지고 Job 은 별도의 스레드 내에서 작업이 이루어지므로 Job 의 모든 처리는 비동기가 됩니다.
아시겠지만 비동기로 실행한 후에는 동기로 전환할 수 없습니다.
일단 메인 스레드가 먼저 처리가 완료되더라도 Job 은 비동기로 모든 작업이 완료될 때까지 백그라운드에서 처리가 진행 됩니다.
스레드 관점에서 동기와 비동기에 대한 개념을 확실하게 이해하는 것이 중요합니다.