본문 바로가기

개발/Spring

Spring 비동기 처리 @Async 어노테이션 사용

반응형

상황 : 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초 쯤 뒤에 ----
비동기 처리 메소드 끝

 

반응형