REST는 서버의 성능을 향상시키기 위해 여러 개의 스레드를 사용

REST 비동기 처리 서비스

 

1, 비동기 처리의 Runnable 나머지 서비스의 사용

메인 스레드를 해제 스레드 처리가 활성화되어 차장은 부사장 직접 스레딩 완료 후 요청을 반환

주요 코드

수입 java.util.concurrent.Callable;
수입 org.slf4j.Logger;
수입 org.slf4j.LoggerFactory;
수입 org.springframework.web.bind.annotation.RequestMapping;
수입 org.springframework.web.bind.annotation.RestController;
/ ** 
 * 
 * @author HZC 
 * 
 * / 
@RestController 
공용  클래스 AsyncController { 

    개인 로거 로거 = LoggerFactory.getLogger (AsyncController. 클래스 ); 

    (@RequestMapping "/ 위해" )
     공공 ) (호출 가능 <문자열> 순서를 던졌습니다{의 InterruptedException 
        logger.info ( "메인 쓰레드 시작" ); 

        주는, Callable <문자열> 결과 = 새로운 새로운 주는, Callable <문자열> () { 

            @Override 
            공공 문자열 ()에 대한 호출이 발생 예외 { 
                logger.info ( "하위 스레드가 시작" ) 
                스레드를. SLEEP ( 1000 ) 
                logger.info ( "서브 실끝" );
                 반환 "성공" ; 
            } 
            
        } 
        logger.info ( "메인 쓰레드 복귀" )
         리턴 결과;

    } 
}

2 비동기 처리 DeferredResult 나머지 서비스의 사용

메인 쓰레드 해제 스레드 1 서브 복귀 요청 스레드 2를 처리 한 후 이하의 전처리, 후 처리 서브 스레드 2, 활성화

비즈니스 시나리오 시뮬레이션

 

 

 대리 메인 스레드가 메시지 큐에 비즈니스 처리 작업, 차장 실이 모니터 메시지 큐 및 처리 작업 대기열 스레드 1를 호출 DeferredResult는 결과를 반환받을 사용하여 큐는 전면에 반환

Controller 클래스

패키지 com.maple.security.web.async; 

수입 org.apache.commons.lang.RandomStringUtils;
수입 org.slf4j.Logger;
수입 org.slf4j.LoggerFactory;
수입 org.springframework.beans.factory.annotation.Autowired;
수입 org.springframework.web.bind.annotation.RequestMapping;
수입 org.springframework.web.bind.annotation.RestController;
수입 org.springframework.web.context.request.async.DeferredResult; 

/ ** 
 * 
 * @author의 HZC 
 * 
 * / 
@RestController 
공공  클래스 AsyncController { 

    개인로거 로거 = LoggerFactory.getLogger (AsyncController. 클래스 ); 

    @Autowired 
    개인 MockQueue mockQueue; 
    
    @Autowired 
    개인 DeferredResultHolder deferredResultHolder; 

    (@RequestMapping "/ 순서" )
     공중 DeferredResult <문자열> 주문은 () 가 발생 예외 : InterruptedException { 
        (logger.info를 "主线程开始" ); 

        문자열 주문 번호 = RandomStringUtils.randomNumeric (8 ); 
        mockQueue.setPlaceOrder (주문 번호); 
        
        DeferredResult <문자열> 결과 = 새로운 DeferredResult <> ();
        deferredResultHolder.getMap () PUT합니다 (주문 번호, 결과); 
        logger.info ( "메인 쓰레드 복귀" );
         반환 결과; 

    } 
}

시뮬레이션 기반 메시지 큐

패키지 com.maple.security.web.async; 

수입 org.slf4j.Logger;
수입 org.slf4j.LoggerFactory;
수입 org.springframework.stereotype.Component; 

/ ** 
 * 
 * @author의 HZC 
 * 
 * / 
@Component 
공용  클래스 MockQueue { 
    
    개인 로거 로거 = LoggerFactory.getLogger (MockQueue. 클래스 ); 


    // 生成下单
    개인 문자열 placeOrder; 

    // 完成下单
    개인 문자열 completeOrder; 

    공공 문자열 getPlaceOrder () {
         반환  placeOrder을;
    }

    공공  무효 setPlaceOrder (문자열 placeOrder) {
         새로운 새로운 스레드 (() -> { 
            logger.info ( "요청하는 주문" )
             은 try { 
                에 Thread.sleep ( 1000 ); 
            } 캐치 (예외 : InterruptedException E) { 
                e.printStackTrace () ; 
            } 
            이 본 .completeOrder = placeOrder; 
            logger.info ( "단일 요청이 처리되는"+ placeOrder) 
        }) 시작 (); 

    } 

    공용 문자열 getCompleteOrder () {
         반환 completeOrder 단계;
    } 

    공공 보이드 setCompleteOrder (문자열 completeOrder) {
          .completeOrder = completeOrder; 
    } 
}

그리고 메시지 큐 리스너 클래스를 처리

패키지 com.maple.security.web.async; 

수입 org.apache.commons.lang.StringUtils;
수입 org.slf4j.Logger;
수입 org.slf4j.LoggerFactory;
수입 org.springframework.beans.factory.annotation.Autowired;
수입 org.springframework.context.ApplicationListener;
수입 org.springframework.context.event.ContextRefreshedEvent;
수입 org.springframework.stereotype.Component; 

@Component 
공용  클래스 QueueListener는 구현 만약 ApplicationListener <ContextRefreshedEvent> { 

    개인 로거 로거 = LoggerFactory.getLogger (QueueListener한다.클래스 ); 

    @Autowired 
    개인 MockQueue mockQueue; 

    @Autowired 
    개인 DeferredResultHolder deferredResultHolder; 

    @Override 
    공공  무효 onApplicationEvent (ContextRefreshedEvent 이벤트) { 

        새로운 스레드 (() -> {
             동안 ( 사실 ) {
                 경우 (StringUtils.isNotBlank (mockQueue.getCompleteOrder ())) { 
                    문자열 주문 번호 = mockQueue.getCompleteOrder (); 
                    logger.info ( "返回订单处理结果:"+ 주문 번호);
                    deferredResultHolder.getMap () 수 (주문 번호) .setResult (."장소 주문 성공" ); 

                    mockQueue.setCompleteOrder ( ); 

                } 다른 {
                     시도 { 
                        (Thread.sleep를 1000 ); 
                    } 캐치 (예외 : InterruptedException 전자) { 
                        e.printStackTrace (); 
                    } 
                } 
            } 
        .})) (시작; 

    } 
}

비동기 처리 결과 클래스

/ ** 
 * 
 * / 
패키지 com.maple.security.web.async; 

수입 java.util.HashMap에;
수입 java.util.Map; 

수입 org.springframework.stereotype.Component;
수입 org.springframework.web.context.request.async.DeferredResult; 

/ ** 
 * @author의 HZC 
 * 
 * / 
@Component 
공공  클래스 DeferredResultHolder { 

    개인 지도 <문자열, DeferredResult <문자열 >>지도 =  의 HashMap <문자열, DeferredResult <문자열 >> (); 

    공개 지도 <문자열, DeferredResult <문자열 >> 하여 getMap () {
         반환지도; 
    } 

    공공  공극 하는 setMap (MAP <문자열 DeferredResult <문자열 >> MAP) {
          .MAP = 지도; 
    } 

}

 

3, 비동기 처리 구성

추천

출처www.cnblogs.com/maple92/p/11616472.html