1. 작업 실행 및 예약
Spring은 taskexecutor 및 taskscheduler 인터페이스를 사용하여 비동기 실행 및 스케줄링 작업에 대한 추상화를 제공합니다.
Spring의 Taskexecutor는 java.util.concurrent.executor 인터페이스와 동일합니다. 이 인터페이스에는 하나의 메소드 실행 (실행 가능한 작업) 만 있습니다.
1.1. taskexecutor 유형
Spring은 많은 Taskexecutor 구현을 내장되어 있으며 직접 구현할 필요가 없습니다.
1.2. 주석이 스케줄링 및 비동기 실행을 지원합니다
@scheduled 및 @async 주석에 대한 지원을 가능하게하려면 @enablescheduling 및 @enableasync를 추가하십시오.
@Configuration 클래스 :@configuration@enableAsync@enableSchedulingPublic 클래스 appConfig {}특별한주의를 기울이십시오
@async 주석을 처리하기위한 기본 조언 모드는 "프록시"이며 프록시를 통한 호출 간섭을 허용합니다. 같은 클래스 내의 지역 통화는 그런 식으로 가로 채지 못할 수 없습니다. 보다 고급 간섭 모드의 경우 컴파일 타임 또는 하중 시간 용접과 함께 "AspectJ"모드로 전환하는 것을 고려하십시오.
기본적으로 @async는 프록시로 처리됩니다. 따라서 동일한 클래스의 메소드는 @async를 사용하여 비동기 적으로 메소드라고 불릴 수 없으며이 상황은 여전히 동기입니다.
예를 들면 다음과 같습니다. 다음, SayHelo ()를 호출 할 때 SayHi ()가 여전히 외부에서 직접 sayshi ()를 외부에서 직접 실행할 수있는 반면 SayHelo ()는 여전히 동시에 실행됩니다.
public class a {public void sayhello () {sayhi (); } @async public void sayhi () {}}1.3. @async 주석
이 메소드에 @async 주석을 추가하면 이것이 비동기 호출임을 의미합니다. 다시 말해,이 방법의 발신자는 즉시 반환을 받고 실제 메소드 실행은 Spring의 Taskexecutor에 작업을 제출하는 것입니다.
다시 말해, 발신자는 호출되면 즉시 반환되며 스프링 Taskexecutor에 제출 된 작업에서 방법의 실제 실행이 발생합니다.
@asyncvoid dosomething () {// 이것은 비동기 적으로 실행됩니다} @asyncvoid dosomething (문자열 s) {// 이것은 비동기 적으로 실행됩니다} @asyncfuture <string> returnsomething (int i) {// 이것은 비동기 적으로 실행됩니다}알아채다:
@Async 메소드는 정기적 인 java.util.concurrent를 선언 할뿐만 아니라 Spring 's org.springframework.util.concurrent.listenablefuture 또는 Spring 4.2에서 JDK 8의 java.util.concurrent.completablefuture를 선언 할 수 있습니다.
1.4. @Async Limited Executor
기본적으로 @async 주석이 메소드에 추가되면 주석 드라이버를 지원하는 집행자가 사용됩니다. 그러나 @async 주석의 값 값은 추가 집행자를 지정할 수 있습니다.
@async ( "OthereXecutor") void dosomething (문자열 s) {// 이것은 "OtherExecutor"}에 의해 비동기 적으로 실행됩니다.여기에서 Otherexecutor는 스프링 컨테이너의 임원 인 Bean의 이름입니다.
1.5. @async 예외 관리
@async 메소드가 미래 유형의 반환 값을 갖는 경우, 미래의 get () 메소드를 입력하여 작업의 실행 결과를 얻을 때 예외를 쉽게 관리 할 수 있습니다. 리턴 유형이 무효화되면 예외가 잡히지 않습니다.
공개 클래스 myasyncuncuggexception handler asyncuncuggexception handler {@override public void handleunctexception (throwable ex, method method, object ... params) {// 핸들 예외}}} 2. 스레드 풀 구성
import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.scheduling.annotation.enableasync; import org.springframework.scheduling.concurrent.threadpooltaskexecutor;@configuration@enableasyncpublic class taskexecutorconfig {private intger corepoolsize = 30; 개인 정수 maxpoolsize = 50; 개인 정수 Keepaliveseconds = 300; // 개인 정수 queuecapacity = 2000; @bean ( "Mythreadpooltaskexecutor") Public ThreadPooltaskexecutor Mythreadpooltaskexecutor () {ThreadPooltasKexEcutor Executor = New ThreadPooltasKexEcutor (); executor.setCorePoolSize (CorePoolSize); executor.setmaxpoolsize (maxpoolsize); executor.setKeepaliveseconds (recopaliveseconds); // executor.setqueuecapacity (queuecapacity); executor.setwaitfortaskStocompleteOnShutdown (true); executor.initialize (); 귀환 집행자; }} 부르다
@async ( "Mythreadpooltaskexecutor") @override public void present (couponpresentlogentity entity) {try {couponbaseresponse rst = couponsendrpcservice.send (entity.getUserid (), entity. if (null! = rst && rst.issuccess ()) {entity.setStatus (pritientStatusenum.success.getType ()); } else {문자열 rasy = (null == rst)? "응답 예외": rst.getmsg (); Entity.SetFailurereason (이유); Entity.setStatus (presentStatusenum.failure.getType ()); }} catch (예외 예) {log.error (ex.getMessage (), ex); Entity.setFailurereason (ex.getMessage ()); Entity.setStatus (presentStatusenum.failure.getType ()); } 쿠폰 프레젠트 로그 다오 .update (엔티티); }결과
[Info] 2018-05-09 16 : 27 : 39.887 [Mythreadpooltaskexecutor-1] [com.ourhours.coupon.rpc.dubbo.receivelogfilter]-메소드-이름 : 보내기; 인수 : [10046031, "4d7cc32f8f7e4b00bca56f6bf4b3b658", "1", 10001]
[Info] 2018-05-09 16 : 27 : 39.889 [Mythreadpooltaskexecutor-2] [com.ourhours.coupon.rpc.dubbo.receivelogfilter]-메소드-이름 : 보내기; 인수 : [10046031, "4d7cc32f8f7e4b00bca56f6bf4b3b658", "1", 10001]
참조 :
스프링 프레임 워크 참조 문서 4.3.17. Release
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.