spring에서 Async, 즉 비동기 기능을 사용하는 방법은 아주 간단하다.
Spring Async annotation를 이용하여 간단하게 비동기 처리가 가능하다.@async 를 선언한 메소드를 호출한 호출자는 즉시 리턴하고 실제 실행은 Spring TaskExecutor에 의해 실행.메서드는 Future 타입 값을 리턴하여 해당 Future에 get() 메서드를 이용하여 작업 수행을 할 수 있다.
Executor는 스레드 풀의 개념으로 Java 5에서 도입된 개념. 구현체가 실제 Pool이라고 확신 할 수 없어 Executor(직역: 집행자)라 사용.TaskExecutor 인터페이스는 실행하는 Task를 받고 execute 메서드를 갖는다.
@Configuration
@EnableAsync
public class Config implements AsyncConfigurer {
private static int TASK_CORE_POOL_SIZE = 2;
private static int TASK_MAX_POOL_SIZE = 4;
private static int TASK_QUEUE_CAPACITY = 10;
private static String BEAN_NAME = "executorSample"; @Resource(name = "executorSample")
private ThreadPoolTaskExecutor executorSample;}
@Bean(name = "executorTest")
@Override
public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(TASK_CORE_POOL_SIZE);
executor.setMaxPoolSize(TASK_MAX_POOL_SIZE);
executor.setQueueCapacity(TASK_QUEUE_CAPACITY);
executor.setBeanName(BEAN_NAME);
executor.initialize(); return executor;}@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new AsyncUncaughtExceptionHandler();}
@Service("asyncTask")
public class AsyncTask{ @Async("executorTest")
public void executor(String str) {
System.out.println("result:"+str); }
}
public class AsyncController{
@Resource(name = "asyncTask")
private AsyncTask asyncTask;
@Resource(name = "Config")
private Config config; @RequestMapping("/test.do")
public ModelAndView doTask(HttpServletRequest request, HttpServletResponse response) throws Exception {
asyncTask.executor("TEST"); }}
public SocketChannel socketChannel2; //일단은 public으로
private boolean bLoop = true;
@Async
public CompletableFuture<SocketChannel> csSocketStart() throws IOException {
socketChannel2 = null; // HL7 Test Panel에 보낼 프로토콜
socketChannel2 = SocketChannel.open();
logger.debug("central로 보내는 socket channel");
try {
socketChannel2.connect(new InetSocketAddress("localhost", 5051));
logger.debug("socketChannel connected to port 5051");
socketChannel2.configureBlocking(true);// Non-Blocking I/O
} catch (Exception e2) {
logger.debug("connected refused!!!");
// e2.printStackTrace();
socketChannel2.close();
}
return CompletableFuture.completedFuture(socketChannel2);
}
---다른 클래스에서 호출
try {
CompletableFuture<SocketChannel> completableFuture = csSocketService.csSocketStart();
SocketChannel channel = completableFuture.get(); //일단은 그냥 blocking 시켜서 보내자. 후에 thencombine으로 교체
System.out.println(channel);
csSocketService.hl7ProtocolSendThread(sb.toString(), channel);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
**[자바와 스프링의 비동기 기술해당 포스팅은 토비님의 토비의 봄 TV 8회 스프링 리액티브 프로그래밍 (4) 자바와 스프링의 비동기 기술 라이브 코딩을 보며 따라했던 실습 내용을 바탕으로 정리한 글입니다. 실습 코드들은 IntelliJ를 이용해…
jongmin92.github.io](https://jongmin92.github.io/2019/03/31/Java/java-async-1/)
**[[Spring 레퍼런스] 26장 태스크(Task) 실행과 스케줄링 :: Outsider's Dev Story이 문서는 개인적인 목적이나 배포하기 위해서 복사할 수 있다. 출력물이든 디지털 문서든 각 복사본에 어떤 비용도 청구할 수 없고 모든 복사본에는 이 카피라이트 문구가 있어야 한다. 스프링 프레임워크는…
blog.outsider.ne.kr](https://blog.outsider.ne.kr/1066)
**[SPRING @Async를 활용한 multi thread 구현 - 2 - AsyncConfigurer 생성Spring 에서 비동기 처리를 하기 위해서 AsyncConfigurer@Asynk를 사용하려고 한다. 본 포스팅은 이번 시간에는 AsyncConfigurer 을 활용하여 Executor 를 생성하는 방법까지이다…
cofs.tistory.com](https://cofs.tistory.com/319)
https://pakss328.medium.com/spring-async-annotation을-활용한-thread-구현-f5b4766d49c5
https://jsonobject.tistory.com/233
주의 할 점은 private 메소드는 @Async 를 적용해도 비동기로 동작하지 않으며, 반드시 public 메소드에 @Async 를 적용해야 한다.
self-invocation(자가 호출)해서는 안된다. -> 같은 클래스 내부의 메서드를 호출하는 것은 안된다.