티스토리 뷰

java&spring

@Async를 통한 비동기 처리

sungjine 2016. 10. 8. 07:52
반응형

 - 비동기 : 하나의 요청이 모두 처리되기를 기다리는 것이 아니라 처리되지 않더라도 제어권을 다음 요청에 넘기는 것을 비동기라 한다.


 - 제약사항 : 

    1. public 한 메소드에만 써야한다.

    2. 같은 클레스 안에서 @Async를 적용한 메소드를 사용하면 작동하지 않는다.

    3. return Type이 void이거나 Future객체를 사용해야 한다.


 - @Async를 사용하기 위한 설정

@EnableAsync

public class AppConfig implements AsyncConfigurer {

@Override

public Executor getAsyncExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

executor.setCorePoolSize(7);

executor.setMaxPoolSize(42);

executor.setQueueCapacity(11);

executor.setThreadNamePrefix("MyExecutor-");

executor.initialize();


return executor;

}

@Override

public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {

return new CustomAsyncExceptionHandler();

}

}


public class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

@Override

public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {

System.out.println("Exception message - " + throwable.getMessage());

System.out.println("Method name - " + method.getName());

for (Object param : obj) {

System.out.println("Parameter value - " + param);

}

}

}


 - Test Code

@Controller

public class TestController {

private static final Logger log = LoggerFactory.getLogger(TestController.class);

@Autowired TestAsync TestAsync;

    

@RequestMapping(value = "/test", method = RequestMethod.GET)

public String test() {

log.info("start");

for(int i = 0; i < 10; i++) {

TestAsync.print(i);

}

log.info("finish");

return "view/user/login";

}

}


@Component

public class TestAsync {

private static final Logger log = LoggerFactory.getLogger(TestAsync.class);

@Async

public void print(int count){

log.info("start async : " + count);

try {

Thread.sleep(5000);

} catch (Exception e) {

log.error(e.getMessage());

}

log.info("final async : " + count);

}

}


 - Test 결과

start

finish

start async : 0

start async : 5

start async : 4

start async : 6

start async : 3

start async : 2

start async : 1

final async : 0

final async : 5

start async : 7

final async : 4

start async : 8

start async : 9

final async : 6

final async : 3

final async : 2

final async : 1

final async : 7

final async : 8

final async : 9

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/12   »
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