SPRING @Async를 활용한 multi thread 구현 - 3 - @Async 사용 및 Task 추가

2017. 7. 11. 11:25framework/spring

 

SPRING @Async를 활용한 multi thread 구현 - 3 - @Async 사용 및 Task 추가

 

 

Spring 에서 비동기 처리를 하기 위해서 AsyncConfigurer@Asynk를 사용하려고 한다.

 

 

 개발 환경은 Java 8 , Tomcat 8 , Spring 4.1 이다.

 

 

본 포스팅은  

 

 

SPRING @Async를 활용한 multi thread 구현 - 1 - 개요

SPRING @Async를 활용한 multi thread 구현 - 2 - AsyncConfigurer 생성

SPRING @Async를 활용한 multi thread 구현 - 3 - @Async 사용 및 Task 추가

SPRING @Async를 활용한 multi thread 구현 - 4 - ExceptionHandler 생성

SPRING @Async를 활용한 multi thread 구현 - 5 - 구현

 

 



 

이번 시간에는 @Async를 활용하여 Task를 만들어 보자.

 

이전 시간에 Executor 를 2개 만들었다.

 

그래서 필자는 AsyncTask 를 관리할 수 있는 class 파일을 2개 만들었다.

 

1개를 만들어도 상관없지만 구분하여 혼선이 없도록 하였다.

 

 

 

먼저 기본적으로 생성된 Executor 인 executorSample 과 연결할 AsyncTask class 파일이다.

1
2
@Service("asyncTaskSample")
public class AsyncTaskSample {
cs

Service 라고 등록하고 클래스 파일명은 AsyncTaskSample로 만든다.

 

 

이제 task 를 만들어 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    @Async("executorSample")
    public void executorSample(String str) {
        // LOG : 시작 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD START");
        
        // 내용
        // 내용
        // 내용
        
        // LOG : 종료 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD END");
    }
 
    @Async("executorSample")
    public void executorSample2(String str) {
        // LOG : 시작 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD START");
        
        // 내용
        // 내용
        // 내용
        
        // LOG : 종료 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD END");
    }
cs

1#, 16# : @Async 를 사용해서 비동기 메소드라고 선언하고 연결할 Executor 명을 적어준다.

나머지는 특별한 내용 없다.

내용에는 이제 비동기로 할 작업을 코딩하거나 함수를 호출하면 끝이다.

 

 

 

 

위 메소드를 생성 시 필자는 리턴타입을 void로 작성했다.

 

리턴타입은 void와 Future<String> 두가지로 작성할 수 있다.

 

Future<String>는 메소드의 실행 결과를 리턴한다고 하지만 크게 필요는 없어보인다.

 

상황에 따라 다르겠지만 필자의 경우가 그랬으니 생략함.

 

 

또한 @Async 사용시 제약사항이 있다고 한다.

 

첫번째는 함수는 무조건 public 타입이여야 한다.

 

두번째는 같은 클래스 안에서 셀프호출은 안된다.

 

 

이 두가지만 조심하면 될거같다.

 

 

 

 

executorEtc Executor 와 연결할 class 파일도 동일하게 만들어 주면 된다.

 

이름만 sample 에서 etc로 바뀔 뿐 모든것이 같아서 생략한다.

 

맨 아래 전체 소스에서 확인하면 된다.

 

다음 시간에는 ExceptionHandler 을 구현해 본다.

 

 



 

전체소스

AsyncTaskSample.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
 
/**
 * @Title      : AsyncTaskSample 관리
 * @Filename   : AsyncTaskSample.java
 */
@Service("asyncTaskSample")
public class AsyncTaskSample {
    
    /**
     * 시뮬레이션 테스트용 함수
     *
     * @param str
     */
    @Async("executorSample")
    public void executorSample(String str) {
        // LOG : 시작 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD START");
        
        // 내용
        // 내용
        // 내용
        
        // LOG : 종료 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD END");
    }
    
    /**
     * 시뮬레이션 테스트용 함수2
     *
     * @param str
     */
    @Async("executorSample")
    public void executorSample2(String str) {
        // LOG : 시작 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD START");
        
        // 내용
        // 내용
        // 내용
        
        // LOG : 종료 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD END");
    }
}
 
cs

 

AsyncTaskEtc.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
 
/**
 * @Title      : AsyncTaskEtc 관리
 * @Filename   : AsyncTaskEtc.java
 */
@Service("asyncTaskEtc")
public class AsyncTaskEtc {
    
    /**
     * 기타 스레드 테스트용 함수
     *
     * @param str
     */
    @Async("executorEtc")
    public void executorEtc(String str) {
        // LOG : 시작 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD START");
        
        // 내용
        // 내용
        // 내용
        
        // LOG : 종료 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD END");
    }
    
    /**
     * 기타 스레드 테스트용 함수2
     *
     * @param str
     */
    @Async("executorEtc")
    public void executorEtc2(String str) {
        // LOG : 시작 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD START");
 
        // 내용
        // 내용
        // 내용
        
        // LOG : 종료 입력
        // ...
        System.out.println("==============>>>>>>>>>>>> THREAD END");
    }
}
 
cs