파워노트

@Async @Scheduler ThreadPool 생성 및 사용. 본문

spring legacy

@Async @Scheduler ThreadPool 생성 및 사용.

파워킴 2022. 3. 8. 00:54
반응형

* Scheduler 및 비동기 처리 에 대해 Thread pool 생성 설정 및 사용을 해보자 .

 


# xml 설정. 

[ servlet-context.xml ]

<task:executor id="AsyncExecutor" pool-size="10-100" queue-capacity="50" />
<task:scheduler id="SchedulerExecutor" pool-size="5" />
<!-- @Async and @Scheduler 설정 executor 는 기본으로 사용할 executor 설정. 설정이 없을때는 @Async-->
<task:annotation-driven executor="AsyncExecutor" scheduler="SchedulerExecutor" />
task:execute :  Async 비동기 처리시에 사용할 pool 설정.
task:scheduler :  scheduler 에서 사용할 pool 설정
task:annotation-driven : @Async @Scheduler 사용가능하게 하며,  기본 async executor 및 scheduler 를 설정한다.
** (주의 사항 ) executor 가 설정되어 있지 않은경우 기본적으로 @Async     와 같이 (id 지정 사용없이 )를 사용하면 SimpleAsyncTaskExecutor를 이용하게 되어  쓰레드제한 없이 무한으로 처리된다. 
** 따라서 @Async("AsyncExecutor") 와 같이 명시적으로 사용하는것이  깔끔함. 

 

[ * Scheduler -   class 내에서의 사용 ] 

@Scheduled(cron = "10 * * * * *")
public void scheldulerlog() {
    log.info("############# Scheduler ############## [[ " + Thread.currentThread().getName());
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    log.info("############# Scheduler ############## ]] " + Thread.currentThread().getName());
}

[ scheduled cron 표현식 ]

( cron = 10 * * * * * )
          1 2 3 4 5 6
1 : 초(0-59)
2 : 분(0-59)
3 : 시간(0-23)
4 : 일 (1-31)
5 : 월 (1-12)
6 : 요일 (0-7) 0과 7은 일요일이며, 1부터월요일 6이 토요일
* : 모든조건
? : 설정 값 없을 때 (날짜와 요일에서만 사용가능 )
- : 범위지정
, : 여러값 지정
/ : 초기값과 증가치 설정

 

[ * Async -   class 내에서의 사용 ] 

제약사항 :
    1. public 한 메소드에만 써야한다.
    2. 같은 클레스 안에서 @Async를 적용한 메소드를 사용하면 작동하지 않는다.
    3. return Type이 void이거나 Future객체를 사용해야 한다.
@Async("AsyncExecutor")
public void backgroundJob() {
    log.info("############# Async ############## [[" + Thread.currentThread().getName());

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    log.info("############# Async ############## ]]" + Thread.currentThread().getName());
}

 

 

 

반응형
Comments