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, 비동기 처리 구성