springboot 비동기 호출@Async 의 예제 구현
7996 단어 springboot비동기 호출@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 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.