반응형
상황 : jdk 1.6, 스프링 4.X 사용 중. 찾아보니 jdk1.5 ~ 스프링 3.2 부터 @Async 사용 가능한 것 같음.
사용 :
1) 설정 : AsyncConfig.java 파일 생성 (더 이상 해야할 설정도 없음. 간단)
- @Configuration 사용해 bean 등록
- @EnableAsync 사용해 비동기 메소드 실행 기능 활성화
import java.util.concurrent.Executor;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
@EnableAsync
public class AsyncConfig extends AsyncConfigurerSupport{
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5); // 기본적으로 실행을 대기하고 있는 Thread 수
executor.setMaxPoolSize(50); // 동시 동작하는 최대 Thread 수
executor.setQueueCapacity(50); // MaxPoolSize 를 초과하는 경우, Queue에 저장
executor.setThreadNamePrefix("ThreadPoolTaskExecutor-"); // 생성하는 Thread 의 접두사 지저ㅛㅇ
executor.initialize();
return executor;
}
}
2) 비동기 처리 메소드가 들어갈 서비스 파일 생성 :
- 반드시 public으로 메서드 선언한다. (private 은 안됨!)
- 같은 클래스에 있는 메소드에 @Async 설정하여 호출할 경우 동작하지 않는다.
import javax.annotation.Resource;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import com.dreamsecurity.framework.utils.PrintStackTraceUtils;
import com.dreamsecurity.magiclinehub.common.utils.HttpConnectionUtils;
import com.dreamsecurity.magiclinehub.dao.AgentNotiDao;
import com.dreamsecurity.magiclinehub.vo.AgentNotiVo;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class AsyncService {
@Async
public void asyncMethod(Long time) {
try {
Thread.sleep(time);
log.debug("비동기 처리 메소드 끝");
} catch (Exception e) {
log.error(PrintStackTraceUtils.getErrStrFromException(e, true));
}
}
}
3) 비동기 처리를 호출할 메소드 생성
@Slf4j
@Service
public class AsyncTestService {
@Autowired
private AsyncService asyncService;
public void asyncTest( AgentNotiVo form ) {
Long time = 3000L;
asyncService.asyncMethod(time);
log.debug("테스트 메소드 완료");
}
}
콘솔 출력 결과 : 비동기 처리 메소드 내의 로그는 메소드 호출 3초뒤에 찍힘.
테스트 메소드 완료
---- 3초 쯤 뒤에 ----
비동기 처리 메소드 끝
반응형
'개발 > Spring' 카테고리의 다른 글
RestTemplate 을 이용해서 HTTP통신하기. (0) | 2024.04.19 |
---|---|
nested exception is org.apache.ibatis.binding.BindingException: Parameter 'fromDate' not found. (0) | 2022.02.16 |
log4j2 + slf4j 설정하기 ( + lombok) (0) | 2022.01.21 |
Spring HandlerInterceptorAdapter deprecated 해결. (1) | 2022.01.17 |
[Spring] @Valiated, BindingResult 사용하여 데이터 유효성 검증하기 (2) | 2022.01.07 |