springboot 비동기 호출@Async 의 예제 구현

백 엔 드 개발 에서 시간 이 걸 리 거나 제3자 시스템 이 호출 되 는 상황 을 자주 만 납 니 다.우 리 는 자바 프로그램의 일반적인 실행 절 차 는 순서대로 실행 되 는 것 을 알 고 있 습 니 다.그러나 순서 집행 의 효율 은 우리 가 기대 하 는 것 에 이 르 지 못 할 것 입 니 다.이 럴 때 병행 할 수 있 기 를 기대 합 니 다.일반적인 방법 은 다 중 스 레 드 나 스 레 드 풀 을 사용 하 는 것 입 니 다.코드 를 추가 로 작성 해 야 합 니 다.spring 3.0 이후@Async 주 해 를 도 입 했 습 니 다.이 주 해 를 사용 하면 스 레 드 탱크 의 실행 효 과 를 얻 을 수 있 고 개발 에 있어 서 매우 간단 합 니 다.
개술
springboot 은 spring 프레임 워 크 를 기반 으로 springboot 환경 에서@Async 주 해 를 보 여 주 는 사용 방식 입 니 다.이 주해 의 정 의 를 먼저 보고,

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Async {

 /**
  * A qualifier value for the specified asynchronous operation(s).
  * <p>May be used to determine the target executor to be used when executing this
  * method, matching the qualifier value (or the bean name) of a specific
  * {@link java.util.concurrent.Executor Executor} or
  * {@link org.springframework.core.task.TaskExecutor TaskExecutor}
  * bean definition.
  * <p>When specified on a class level {@code @Async} annotation, indicates that the
  * given executor should be used for all methods within the class. Method level use
  * of {@code Async#value} always overrides any value set at the class level.
  * @since 3.1.2
  */
 String value() default "";

}
이 설명 은 하나의 속성 만 있 는 것 을 볼 수 있 습 니 다.바로 value 입 니 다.설명 에서 value 가 지정 한 것 은 이 작업 을 수행 하 는 스 레 드 풀 입 니 다.즉,우 리 는 시스템 기본 값 이 아 닌 하위 정의 스 레 드 풀 을 사용 하여 우리 의 임 무 를 수행 할 수 있 습 니 다.이 주해 의 주 해 를 보고 있 습 니 다.

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
즉,이 주 해 는 방법 과 유형 에 쓸 수 있다.클래스 에 표 시 된 클래스 의 모든 방법 은 비동기 방식 으로 실 행 됩 니 다.즉,스 레 드 탱크 에 제출 하여 실 행 됩 니 다.
상술 하 다
위 에 서 는@Async 주해 에 대해 간단하게 설명 하 였 으 며,아래 는 용법 을 보 았 다.
1.@EnableAsync 주석
springboot 에서@Async 주 해 를 사용 하려 면 springboot 시작 클래스 에서@EnableAsync 주 해 를 사용 해 야 합 니 다.@Async 주해 의 자동 설정 을 켜 면 다음 과 같 습 니 다.

package com.example.demo;

import com.example.demo.properties.ApplicationPro;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableConfigurationProperties({ApplicationPro.class})
//  @Async       
@EnableAsync
public class DemoApplication {

 public static void main(String[] args) {
  SpringApplication.run(DemoApplication.class, args);
 }

}
시작 클래스 에@EnableAsync 주 해 를 사용 해 야@Async 주해 가 적 용 됩 니 다.
2,@Async 주해
위 에서@EnableAsync 주 해 를 사용 하여@Async 주해 에 대한 설정 이 열 렸 습 니 다.다음은 구체 적 인 비동기 호출 클래스 를 보십시오.

package com.example.demo.service;

import com.example.demo.Student;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;

import java.util.concurrent.Future;

@Service
@Async
public class AsyncService {
 public Future<Student> get(){
  Student stu=new Student("1","3");
  try {
   Thread.sleep(10000l);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  return AsyncResult.forValue(stu);
 }

 public void executeRemote(){
  try {
   Thread.sleep(10000l);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
}
우선,이 클래스 를 spring 관리 하려 면@Service 주해(또는 다른 주해 도 가능)를 사용 해 야 합 니 다.그리고 클래스 에@Async 주 해 를 표시 해 야 합 니 다.앞에서 말 했 듯 이@Async 주 해 는 방법 이나 클래스 에서 사용 할 수 있 고 클래스 에서 사용 하면 클래스 의 모든 방법 은 비동기 로 실 행 됩 니 다.비동기 실행 클래스 에는 두 가지 방법 이 있 는데,모든 방법 은 실행 시간 을 보 여주 기 위해 10s 를 잔다.이 두 가지 방법 중 하 나 는 반환 값 이 있 고,다른 하 나 는 반환 값 이 없 으 며,중점 은 반환 값 이 있 는 것 을 본다.

public Future<Student> get(){
  Student stu=new Student("1","3");
  try {
   Thread.sleep(10000l);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  return AsyncResult.forValue(stu);
 }
왜 방법의 반환 값 이 Future 인지,@Async 주석 에 다음 과 같은 말 이 있 습 니 다.

위의 주석 에서 Future 로 돌아 가 는 것 은 문제 가 없다 는 것 을 설명 할 수 있 습 니 다.그러나 우리 의 방법 은 일반적인 방법 입 니 다.Future 류 로 어떻게 돌아 가 야 하 는 지 당황 하지 않 습 니 다.spring 은@Async 주해 에 대해 AsyncResult 류 를 제 공 했 습 니 다.유형 명 에서 알 수 있 듯 이 이 종 류 는@Async 주 해 를 위해 준비 한 것 입 니 다.

그 중의 forValue 방법 을 사용 하면 일반적인 Future 류 를 되 돌 릴 수 있 습 니 다.
테스트 클래스 를 보 세 요.

package com.example.demo.controller;

import com.example.demo.Student;
import com.example.demo.service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@Controller
@RequestMapping("async")
public class ControllerAsyncTest {
 @Autowired
 private AsyncService asyncService;
 @RequestMapping("/test")
 @ResponseBody
 public Student get(){
  try {
  long start=System.currentTimeMillis();  //        get  
  Future<Student> result=asyncService.get();  //       executeRemote  
  asyncService.executeRemote();
  
  Student student=result.get();
  long end=System.currentTimeMillis();
  System.out.println("    :"+(end-start));
  return student;
  } catch (InterruptedException e) {
   e.printStackTrace();
  } catch (ExecutionException e) {
   e.printStackTrace();
  }
  return null;
 }
}
테스트 클래스 는 간단 한 controller 입 니 다.get 과 execute Remote 방법 을 호출 했 습 니 다.이 두 가지 방법 은 각각 10s 를 잠 들 고 get 은 반환 값 이 있 습 니 다.다음은 get 의 반환 값 을 받 을 수 있 는 지,그리고 이 두 가지 방법 을 호출 하 는 시간 을 보 겠 습 니 다.

반환 치 를 성공 적 으로 획득 하여 실행 시간 을 볼 수 있 습 니 다.
2020-12-12 21:37:43.556 INFO 11780 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 5 ms
실행 시간:10006
실행 시간 은 10006 ms,즉 10s 여 입 니 다.위의 분석 두 가지 방법 에 따라 각각 10s 를 잠 들 었 습 니 다.동기 적 으로 실행 하면 20s 가 분명 합 니 다.@Async 주 해 를 제거 하고 실행 시간 을 보 세 요.
2020-12-12 21:41:07.840 INFO 11584 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 5 ms
실행 시간:20001
실행 시간 은 20001 ms 로 두 가지 방법 으로 잠 을 자 는 시간 과 테스트 류 자체 의 시간 을 계산 하면 20001 ms 가 맞습니다.여기 서@Async 주해 의 역할 을 알 수 있 습 니 다.모든 방법 을 스 레 드 탱크 에 미 션 으로 제출 하여 미 션 수행 시간 을 향상 시 켰 습 니 다.
또한 비동기 실행 결 과 를 얻 기 위해 아래 방법 을 사 용 했 습 니 다.

Future<Student> result=asyncService.get();
asyncService.executeRemote();
//      
Student student=result.get();
주 스 레 드 에서 작업 수행 결 과 를 얻 으 려 면 Future 류 의 get 방법 으로 결 과 를 얻 을 수 있 습 니 다.이 결 과 는 작업 이 끝 난 후에 야 얻 을 수 있 습 니 다.
3.총화
본 고 는 비동기 호출@Async 주해 의 사용 을 설명 하 였 습 니 다.
1.@EnableAsync 주석 을 사용 하여@Async 주석 에 대한 지원 을 시작 합 니 다.
2.클래스 나 방법 에@Async 주 해 를 사용 합 니 다.
springboot 이 비동기 호출@Async 를 실현 하 는 예제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 springboot 비동기 호출@Async 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기