SPRING @Async를 활용한 multi thread 구현 - 5 - 구현
2017. 7. 11. 11:54ㆍframework/spring
SPRING @Async를 활용한 multi thread 구현 - 5 - 구현
Spring 에서 비동기 처리를 하기 위해서 AsyncConfigurer@Asynk를 사용하려고 한다.
개발 환경은 Java 8 , Tomcat 8 , Spring 4.1 이다. |
본 포스팅은
이번 시간에는 @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 |
'framework > spring' 카테고리의 다른 글
SPRING @Async를 활용한 multi thread 구현 - 5 - 구현 (12) | 2017.07.11 |
---|---|
SPRING @Async를 활용한 multi thread 구현 - 4 - ExceptionHandler 생성 (0) | 2017.07.11 |
SPRING @Async를 활용한 multi thread 구현 - 3 - @Async 사용 및 Task 추가 (0) | 2017.07.11 |
SPRING @Async를 활용한 multi thread 구현 - 2 - AsyncConfigurer 생성 (0) | 2017.07.11 |
SPRING @Async를 활용한 multi thread 구현 - 1 - 개요 (0) | 2017.07.11 |
spring excel csv download 하기 / super-csv jar 사용하기 / AbstractView (0) | 2017.06.30 |
Security 로그인 후 이전페이지 가기 | spring (1) | 2016.01.05 |
특정 JAVA , JSP 에서 Bean 객체 가져오기 | spring (0) | 2016.01.05 |
메일 보내기 / mail sample | spring (0) | 2016.01.05 |
vo list / form list / @ModelAttribute list / list로 받기 | spring (0) | 2016.01.05 |
@ResponseBody / ajax / 아작스 / messageConverters | spring (0) | 2016.01.05 |
article 잘 봣는데요... 궁금한점이 있습니다;;;;4장에서 handleUncaughtException을 만들었었는데 ,
TaskRejectedException 대신에 넣게 되면 사용할 수 있는건가요? 4장의 handleUncaughtException를 어떻게 사용하는지 머리가 나빠서인지 이해가 잘 안되네요;;;; 아니면 그냥 구현만 해놓으면 exception 탈때 타게 되는거 같은 느낌이;;드는데 맞는지 애매하네요;;
안녕하세요 ㅎㅎ
4장처럼 exception 헨들러 만들고 스레드랑 연결시켜 놓으면 해당 스레드에서 오류 발생 시 연결시켜놓은 핸들러에서 해다 ㅇ오류를 처리 할 수 있습니다 ㅎㅎ
감사합니다
와 3년전 글에 이렇게 빠른 답변 남겨주셔서 감사합니다. 제가 테스트로 돌려봣으면 될일이엇을것을;;;
무튼 글도 답변도 감사합니다. 큰 도움되었습니답!~~!~~~ 좋은 하루 되세요~
ㅎㅎ
장마 조심, 코로나 조심하세요:)
안녕하세요. 많은 도움이 되었습니다.
한가지 궁금한 점이 있는데요. 한개의 쓰레드의 실행시간이 길어지면
체크해서 해당 쓰레드는 강제종료하고 다음 쓰레드로 넘어갈수 있게하는 기능은 없을까요?
안녕하세요 ㅎㅎ
저도 해보진 않았지만 음... 제 블로그 포스팅들 기준으로 이렇게 해볼 수 있을 것 같아요
AsyncConfig 쪽에 생성한 executor 의 shutdown 함수를 활용할 수 있도록 함수를 하나 만들고
Thread 실행하는 쪽에서 실행시간을 체크하다가 특정 시간이 지나면 위에서 생성한 shutdown 함수를 호출해 보면 어떨까 싶어요
Executor 내부에 실행 timeout 관련된 함수는 따로 잘 모르겠네요 ㅎㅎ
테스트 해보고 알려드리면 더 좋을텐데 ㅠㅠ 제 상황이 현재 여의치 않아서 죄송해요 ㅠㅠ..
네 ㅎㅎ 감사합니다!
감사합니다 ㅎㅎ
안녕하세요 올려주신 @Async Thread 방법으로 잘 처리했습니다.
개발하면서 궁금한게 있는데 혹시 이렇게 Thread처리가 진행하다가 중간에 Thread 취소(정지)하려하는데 어디서 처리를 해야할지 궁금해서 문의글 올려봅니다.
안녕하세요 ㅎㅎ
AsyncConfig 쪽에 생성한 executor 의 shutdown 함수를 활용하도록 방향을 잡으면 중지가 가능할 것으로 보입니다 ㅎㅎ
감사합니다.
아이디만들기
장수마을