두보 동기 비동기 전송

  두보 RPC 미들웨어는 우리가 동기 사용하는 이유 다음 이론적으로 요청이 비동기 처리하고, 오픈 소스 프레임 워크의 기본 인 Netty에서 사용되는 기본 데이터 전송입니까? 두보 프레임 워크는 확실히 비동기 전송 동기화 거래를 수행합니다.

  첫째, 우리는, 비동기 전송 동기화로 분류하는 것을 우리의 요구가?

  1, 호출자가 다음 원격 서비스를 요청, 당신은 지금, 결과를 기다릴 필요는 요청 스레드를 차단해야

  2, 원격 서비스 결과, 웨이크 업 요청 스레드, 발신자 가져 오기 결과를 반환

  동기 비동기 전송 두보, 핵심 클래스는 DefaultFuture이며, 핵심은 GET ()과 수신 (채널 채널 응답 응답).

  DefaultFuture 생성자 :

. 한      개인  정적  최종 지도 <롱, 채널> = 채널 새로운 새로운 ConcurrentHashMap의 <롱, 채널>의 ();
 2  
. 3     // 모든 요청이 DefaultFuture 객체를 생성 한 다음 FUTURES의 ID를 기반으로 선물, 요청 리턴 결과에 저장 DefaultFuture는 대응하는 오브젝트를 찾아 삭제 
4.      개인  정적  최종 지도 <롱 DefaultFuture가> = FUTURES 새로운 새 ConcurrentHashMap의 <롱 DefaultFuture>의을 ()
 . (5)  
(6).      //이 AtomicLong 0으로부터 증가 할 때, 생성 된 요청 객체 ID를 생성 
7.      비공개  최종  ID;
 . 8      개인  최종 채널 채널;
 . 9      // 요청 객체
10      개인  최종 요청 요청]
 . 11      // 타임 아웃 
(12)은      개별  최종  INT를 초과;
 13이다      // 사용 본원 잠금 및 조건 구현 대기 통지기구 
14      개인  최종 잠김 = 새로운 새 ; ReentrantLock와 ()의
 15      개인  최종 DONE 상태 = lock.newCondition ();
 16      개인  최종   시작 = 에 System.currentTimeMillis ();
 . 17      개인  휘발성  전송은,
 18이다      // 반환을 요청의 결과 
(19).      개인 휘발성 응답 응답;
20      개인  휘발성 ResponseCallback 콜백;
21  
22      공중 DefaultFuture (채널 채널 요청 요청 INT 초과) {
 23           .channel = 채널;
24           .request =는 요청;
25           .ID = request.getId ();
26           .timeout = 초과> 0? . 제한 시간 : channel.getUrl () getPositiveParameter (Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT);
27          //이 지도를 대기로했습니다. 
28          FUTURES.put (ID, );
29          CHANNELS.put (ID, 채널);
30      }

 

  가져 오기():

. (1 개)  공개 오브젝트 GET ( INT의 타임 아웃) 가 발생 RemotingException을 {
 2          IF (초과 <= 0 ) {
 . 3              시간 초과 = Constants.DEFAULT_TIMEOUT]
 . (4)          }
 5.          // 의 isDone () (이 반환 된 결과 경우, 즉) 메소드는 응답 값이 있는지 여부를 결정하는 
6          IF (! {의 isDone ())
 . 7               시작 = 에 System.currentTimeMillis ();
 . 8              Lock.lock ()
 . (9)              은 try {
 (10)                  그동안 (! 의 isDone ()) {
 . 11                      // 밖으로 대기 
(12)                     done.await (시간 제한, TimeUnit.MILLISECONDS)
 (13)는                      // 결과를 반환하거나, 제한 시간을 초과하는 경우, 루프가 종료 
(14)                      IF (의 isDone () ||에 System.currentTimeMillis () 시작 -> 시간 초과) {
 15                          BREAK ;
 16                      }
 . 17                  }
 18이다              } 캐치 (예외 : InterruptedException E) {
 . 19                  드로  새로운 새 ;의 RuntimeException의 (E)
 (20)이다              } (가) 마지막 {
 21은                  lock.unlock ();
 22이다              }
 23 인              // 시간외의 경우, 예외가 발생합니다 
24              IF를(! 의 isDone ()) {
 25                  던져  새로운 새로운 의 TimeoutException은 (전송> 0, 채널, getTimeoutMessage은 ( 거짓 ))
 (26)이다              }
 27          }
 28          // 원격 서비스 수익률은 일반적으로 결과가 호출자에게 리턴됩니다 
(29)          반환 returnFromResponse ();
 30      }

 

  (채널 채널 응답 응답) 접수 :

1  공용  정적  무효 수신 (채널 채널 응답 응답) {
 2          시도 {
 3              // 根据请求ID从FUTURES中获取DefaultFuture,并删除
4              DefaultFuture 미래 = FUTURES.remove (response.getId ());
5              경우 (미래! = null이 ) {
 6                  future.doReceived (응답);
7              } 다른 {
 8                  logger.warn ( "마지막에 반환 된 응답 타임 아웃"
 9                          + ( 새로운 SimpleDateFormat의 ( "YYYY-MM-DD HH : MM : ss.SSS.") 포맷 ( 새로운일 ()))
 10                          + "응답"+ 응답
 (11)                          + (채널 ==  "": "채널 :"+ channel.getLocalAddress ()
 12                          + "->"+ channel.getRemoteAddress ()));
13              }
 14          } 마지막 {
 15              // CHANNELS也删除
16              CHANNELS.remove (response.getId ());
17          }
 18      }
1  개인  공극 doReceived (대응 입술) {
 2          lock.lock ();
3          시도는 {
 4              응답 = 입술을;
도 5              의 경우 (! = 이루어 ) {
 (6)                  // 唤醒阻塞的线程
7                  done.signal ();
8              }
 9          } 마지막 {
 10              lock.unlock ();
(11)          }
 (12)          의 경우 (콜백 =! )를 {
 13              invokeCallback (콜백);
(14)         }
 15      }

 

  요약 : 원리 두보 비동기 전송 동기화, 사실, 잠금 및 조건의 사용은 대기 알림 메커니즘을 달성이다. 요청 리턴 결과 일치, 다음 요청이 수신 및 전송 ID로 구현됩니다.

추천

출처www.cnblogs.com/dushenzi/p/12369955.html