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

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

 

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

 

 

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를 사용해 본다.

 

사용할 컨트롤러 생성

1
2
@Controller("SampleAsyncController")
public class SampleAsyncController {
cs

 

AsyncConfig, AsyncTask 들을 @Resource 를 사용해서 가져온다.

1
2
3
4
5
6
7
8
9
10
11
    /** 샘플 스레드 */
    @Resource(name = "asyncTaskSample")
    private AsyncTaskSample asyncTaskSample;
 
    /** 기타 스레드 */
    @Resource(name = "asyncTaskEtc")
    private AsyncTaskEtc asyncTaskEtc;
 
    /** AsyncConfig */
    @Resource(name = "asyncConfig")
    private AsyncConfig asyncConfig;
cs

다음으론 실제로 사용해 봐야 겠지 ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    @RequestMapping("/sample/sampleTask.do")
    public ModelAndView doTask(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //////////////////////////////////////////////////////////////////////////////////////////////////
        // 스레드 생성
        //////////////////////////////////////////////////////////////////////////////////////////////////
        try {
            // 등록 가능 여부 체크
            if (asyncConfig.isSampleTaskExecute()) {
                // task 사용
                asyncTaskSample.executorSample("ㄱ");
            } else {
                System.out.println("==============>>>>>>>>>>>> THREAD 개수 초과");
            }
        } catch (TaskRejectedException e) {
            // TaskRejectedException : 개수 초과시 발생
            System.out.println("==============>>>>>>>>>>>> THREAD ERROR");
            System.out.println("TaskRejectedException : 등록 개수 초과");
            System.out.println("==============>>>>>>>>>>>> THREAD END");
        }
 
        ModelAndView mav = new ModelAndView();
        mav.setViewName("sample/sampleTask");
        return mav;
    }
cs

2# : 메소드 생성

8# : 등록 가능 여부 체크

두번째 포스팅에서 만든 pool 개수를 체크하는 함수이다. 참고하기 바란다.

10# : task 사용

14# : TaskRejectedException 사용

TaskRejectedException 은 등록 개수가 초과했을 경우 발생한다.

 

사용법은 생각보다 간단하다.

 

위와 같은 방법으로 여러 task 에 접근해 사용이 가능하다.

 

 

이상으로 Spring 에서 다중 스레드 생성에 관한 포스팅이 모두 끝이났다.

 

 

 



 

전체소스

SampleAsyncController.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.util.ArrayList;
import java.util.List;
 
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.core.task.TaskRejectedException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
/**
 * @Title      : 샘플 Controller
 * @Filename   : SampleController.java
 */
@Controller("SampleAsyncController")
public class SampleAsyncController {
 
    /** 시뮬레이션 스레드 */
    @Resource(name = "asyncTaskSample")
    private AsyncTaskSample asyncTaskSample;
 
    /** 기타 스레드 */
    @Resource(name = "asyncTaskEtc")
    private AsyncTaskEtc asyncTaskEtc;
 
    /** AsyncConfig */
    @Resource(name = "asyncConfig")
    private AsyncConfig asyncConfig;
 
 
    /**
     * 샘플 Sample 멀티 쓰레드 화면
     * 
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @RequestMapping("/sample/sampleTask.do")
    public ModelAndView doTask(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //////////////////////////////////////////////////////////////////////////////////////////////////
        // 스레드 생성
        //////////////////////////////////////////////////////////////////////////////////////////////////
        try {
            // 등록 가능 여부 체크
            if (asyncConfig.isSampleTaskExecute()) {
                // task 
                asyncTaskSample.executorSample("ㄱ");
            } else {
                System.out.println("==============>>>>>>>>>>>> THREAD 개수 초과");
            }
        } catch (TaskRejectedException e) {
            // TaskRejectedException : 개수 초과시 발생
            System.out.println("==============>>>>>>>>>>>> THREAD ERROR");
            System.out.println("TaskRejectedException : 등록 개수 초과");
            System.out.println("==============>>>>>>>>>>>> THREAD END");
        }
 
        ModelAndView mav = new ModelAndView();
        mav.setViewName("sample/sampleTask");
        return mav;
    }
 
    /**
     * 샘플 ETC 멀티 쓰레드 화면
     * 
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @RequestMapping("/sample/sampleTask2.do")
    public ModelAndView doTask2(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //////////////////////////////////////////////////////////////////////////////////////////////////
        // 스레드 생성
        //////////////////////////////////////////////////////////////////////////////////////////////////
        try {
            List<String> strList = new ArrayList<String>();
            strList.add("A");
            strList.add("B");
            strList.add("C");
            strList.add("D");
 
            // 등록 가능 여부 체크
            if (asyncConfig.isEtcTaskExecute(strList.size())) {
                for (int i = 0; i < strList.size(); i++) {
                    // task 사용
                    asyncTaskEtc.executorEtc(strList.get(i));
                }
            } else {
                System.out.println("==============>>>>>>>>>>> M > THREAD 개수 초과");
            }
        } catch (TaskRejectedException e) {
            // TaskRejectedException : 개수 초과시 발생
            System.out.println("==============>>>>>>>>>>> M > THREAD ERROR");
            System.out.println("TaskRejectedException : 등록 개수 초과");
            System.out.println("==============>>>>>>>>>>> M > THREAD END");
        }
 
        ModelAndView mav = new ModelAndView();
        mav.setViewName("sample/sampleTask");
        return mav;
    }
}
 
cs