원리 추가 코멘트 비동기 @Async 메소드에 호출 스프링 소스 학습

우리는 스프링 프레임을 사용하는 과정에서, 많은 경우에 우리는 시스템의 효율성을 개선하는 방법의 수의 비동기 실행을 @Async 어노테이션을 사용합니다. 오늘 우리는이 기능을 완료하는 방법을 내년 봄 탐험.

   포함하면 빈은 주석 @Async이 들어있는 주사 방식 스캔 봄이, 봄이 동적으로, 우리는 프록시 클래스를 호출 (?) 생성 된 콩에 대한 하위 클래스가 될 것입니다, 우리가 작성한 프록시 클래스는 상속 프록시 클래스에 주입 된 콩, 그리고 그들이 부모 클래스를 호출하지 않습니다,이 방법은 비동기 실행 여부를 결정하기 위해 프록시 클래스, 프록시 클래스에있을 것이다이 방법의 구현에,이 시간에이왔다 (우리는 원래 콩을 썼다 )에 대응하는 방법. 스프링 따라서 비동기 기능을 완료, 구현 과정을,이 스레드 풀 대기열을 읽을 완료를 기다리고, 큐에 배치 큐 자신, 자신이 수행해야하는 방식을 유지한다. 매개 변수는 스레드 풀의 수를 구성 할 수있게 해준다있을 때 우리는 다시 구성하는 작업에 집중할 수 있습니다. 이 구현의 때문에, @Async 댓글을 추가하기 위해 호출 같은 클래스의 방법이 잘못되었습니다! 같은 클래스에있을 때, 메소드 호출은 클래스 본문에서 수행되기 때문에, 봄 메서드 호출을 가로 챌 수 있습니다. 그 한 단계에서, 스프링 AOP, 태양 지향 특성을 알려드립니다. 그의 원칙 및 비동기 주석의 원리는 컨테이너가 정의 된 클래스 섹션으로 스캔 할 때 봄이 시작 유사하다. 이러한 클래스가 주입 될 때 이러한 방법을 호출 할 때, 주입 된 에이전트 클래스는, 프록시 클래스는 성격이라고한다. 상위 클래스의 구현의 방법은 AOP의 이행을 완료하는 코드의 조각을 실행하기 직전 그 봄에 대응하는 프록시 클래스를 통해 호출 후 이동합니다!    우리는 문제가 그 마지막 봄 동적으로 클래스의 서브 클래스를 생성하는 방법은? 연기 수업을?

   

 

 

 

간단한 소개 :

 

Spring은 작업 스케줄링과 비동기 메소드 실행은 주석 지원을 제공합니다. 방법에 @Async 주석을 제공함으로써, 이러한 방법은 비동기 적으로 호출 할 수 있습니다. 전화 할 때 발신자는 즉시 반환하지만 방법의 실제 구현을 완료하는 봄 된 TaskExecutor를 호출하는 것입니다.

 

열기 @Async는 말합니다 :

 

<작업 : 주석 중심의 집행자 = "annotationExecutor"/> 
<-支持@Async注解! -> 
<작업 : 집행자 ID = "annotationExecutor"풀 사이즈 = "20"/>

 

첨가하는 동안 <컨텍스트 : 성분 주사 /> 검사 주석.

 

 

밤 :

 

비교를 위해, 동기 호출에 처음 :

 

@Component 
공용 클래스는 {TestAsyncBean 
    공개 무효 sayHello4 () {예외 : InterruptedException 발생 
        // 네트워크 연결 상기 Thread.sleep를 (* 1000 (2)). . . 메시지 전송. . . 
        에서 System.out.println ( "나는 아, 당신을 사랑 해요!"); 
}
 

 

@RunWith (SpringJUnit4ClassRunner.class) 
@ContextConfiguration ({ "는 CLASSPATH : /applicationContext.xml"}) 
공용 클래스 TestAsync { 
    @Test 
    공공 무효 test_sayHello4 ()이 예외 : InterruptedException, ExecutionException {던졌습니다 
        에서 System.out.println을 ( "당신은 나를 아직 사랑하지 않아 ? "); 
        testAsyncBean.sayHello4 (); 
        에서 System.out.println ("다시 너무 느려, 당신은 확실히) "... 우리가 휴식, 나를 사랑하지 않는다 
        Thread.sleep를 * 1000 (3); // 조기 주요 프로세스를 종료하지 
    } 
}
 

 

출력 :

 

당신이 날 사랑하지 않아? 
내가 당신을 사랑 해요, 아! 
뒤로 너무 느려, 당신은 확실히 날 사랑하지 않는, 우리는 헤어. . .

 

동기 호출은 코드 시퀀스가 ​​계속 이어 기다려야하는 경우 경우, 다음 계속하지 아래로,이 차단됩니다.

 

비동기의 사용은 @Async를 호출

 

 
@Component 
공용 클래스는 {TestAsyncBean 
    @Async 
    공개 무효 sayHello3 () {예외 : InterruptedException 발생 
        // 네트워크 연결 상기 Thread.sleep를 (* 1000 (2)). . . 메시지 전송. . . 
        에서 System.out.println ( "나는 아, 당신을 사랑 해요!"); 
    } 
}
 

 

@RunWith (SpringJUnit4ClassRunner.class) 
@ContextConfiguration ({ "CLASSPATH : /applicationContext.xml"}) 
공용 클래스 TestAsync { 
    @Autowired 
    개인 TestAsyncBean testAsyncBean, 
    @Test 
    공공 무효의 test_sayHello3는 () 예외 : InterruptedException, ExecutionException {던졌습니다 
        "에서 System.out.println을 ( 왜 ");? 더 이상 날 사랑하지 않아 
        testAsyncBean.sayHello3 (); 
        에서 System.out.println ("당신이 실제로 ... 우리가 헤어지고, 말할 게 없다 "); 
        Thread.sleep를 * 1000 (3); // 조기 주요 프로세스를 종료하지 
    } 
}
 

 

출력 :

 

하지 마십시오 당신은 날 사랑하지? 
당신은 실제로 말할 게 없다, 우리가 휴식. . . 
나는 아, 당신을 사랑 해요!

 

비동기 호출, 새 스레드를 열어 호출하는 방법은 메인 스레드에 영향을주지 않습니다. 봄 TaskExecutor를 비동기 방식의 실제 실행은 완료합니다.

 

이러한 방법으로 위의 더 리턴 값이 없으며, 반환 값을 다음과 비동기 호출을 시도 :

 

@Component 
공용 클래스 TestAsyncBean는 { 
    @Async 
    공공 문자열 sayHello2 () 예외 : InterruptedException {던졌습니다 
        // 네트워크 연결하며 Thread.sleep를 (* 1000 2). . . 메시지 전송. . . 
        "나는 아, 당신을 사랑 해요!"를 반환; // 호출이 호출 된 파티 후 즉시 반환, 그래서 널 (null)을 반환합니다 
    } 
}
 

 

@RunWith (SpringJUnit4ClassRunner.class) 
@ContextConfiguration ({ "CLASSPATH : /applicationContext.xml"}) 
공용 클래스 TestAsync { 
    @Autowired 
    개인 TestAsyncBean testAsyncBean, 
    @Test 
    공공 무효의 test_sayHello2는 () 예외 : InterruptedException, ExecutionException {던졌습니다 
        "에서 System.out.println을 ( 왜 당신은 더 이상 나를 사랑 ");?하지 않습니다 
        에서 System.out.println (testAsyncBean.sayHello2 ()); 
        에서 System.out.println ("당신이) "... 우리가 헤어 무슨 말을;? 
        Thread.sleep를 (3 * 1000); // 조기 메인 프로세스를 종료하지 
    } 
}
 

 

출력 :

 

왜 더 이상 날 사랑하지 않아? 
당신이 우리는 헤어 무엇? 말한다. . .

 

반환의 방법으로 직접 액세스가 당신이 비동기 콜백을 사용할 필요가 여기에 작동하지 않습니다 가치가 비동기 방법은 값이 호출 가능하고 미래로, 미래 <>해야합니다 반환합니다.

 

리턴 값을 획득 AsyncResult <> 비동기 호에 따라 :

 

@Component 
공용 클래스 TestAsyncBean { 
    @Async 
    공개 미래 <문자열> sayHello1 ()는 예외 : InterruptedException {발생 
        INT 사고 = 2; 
        에 Thread.sleep (사고 * 1000); // 네트워크 연결. . . 메시지 전송. . . 
        에서 System.out.println는 ( "나는 아, 당신을 사랑 해요!"); 
        신규 새로운 AsyncResult가 <문자열> (+ 생각 + "초"의 "로 메시지를 보내") 반환 
    } 
}
 

 

@RunWith (SpringJUnit4ClassRunner.class) 
@ContextConfiguration ({ "CLASSPATH : /applicationContext.xml"}) 
공용 클래스 TestAsync { 
    @Autowired 
    개인 TestAsyncBean testAsyncBean, 
    @Test 
    공공 무효의 test_sayHello1는 () 예외 : InterruptedException, ExecutionException {던졌습니다 
        미래 <문자열> = null의 미래 ; 
        에서 System.out.println는 ( "당신은 아직 날 사랑하지 않아?"); 
        미래 = testAsyncBean.sayHello1 (); 
        에서 System.out.println을 ( "당신이 실제로 ... 우리가 헤어지고, 말할 게 없다"); 
        스레드를 .sleep을 (1000 * 3); // 기본 과정은 조기에 종료한다하자 
        ]에서 System.out.println (하는 Future.get ()) 
    } 
}
 

 

출력 :

 

하지 마십시오 당신은 날 사랑하지? 
당신은 실제로 말할 게 없다, 우리가 휴식. . . 
나는 아, 당신을 사랑 해요! 
이초 메시지를 보내기

 

 

 

전송 : https://www.cnblogs.com/shangxiaofei/p/6211367.html

추천

출처www.cnblogs.com/panchanggui/p/11550827.html