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( "メインスレッド開始" )、 呼び出し可能 <ストリング>結果= 新しい新しい呼び出し可能の<string> (){ @Override パブリック文字列()の呼び出しはスロー例外{ logger.info( "サブスレッド開始" ) スレッド。 SLEEP( 1000年); logger.info( "サブ糸端" ); リターン "成功" ; } }; logger.info( "メインスレッドリターン" ); 戻り結果。 } }
2、非同期処理休憩DeferredResultサービスの利用
メインスレッドを解放し、スレッド1は、サブリターン要求スレッド2を処理した後、有効サブ前処理、後処理サブスレッド2
ビジネスシナリオのシミュレーション
副メインスレッドがメッセージキューに入れ業務処理タスク、副スレッド2つのモニタメッセージキュー、および処理タスクキューのスレッド1を呼び出し、DeferredResultを使用して、キューは結果が返されます、前に戻りました
コントローラクラス
パッケージ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の<string>順序は()スローInterruptedExceptionある{ (logger.infoを "主线程开始" )。 ストリングORDERNUMBER = RandomStringUtils.randomNumeric(8 )。 mockQueue.setPlaceOrder(ORDERNUMBER)。 DeferredResult <文字列>結果= 新しい DeferredResult <>(); deferredResultHolder.getMap()PUT(ORDERNUMBER、結果);. 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( "要求するため" ); 試み{ の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())){ 文字列ORDERNUMBER = mockQueue.getCompleteOrder(); logger.info( "返回订单处理结果:" + 注文番号); 。deferredResultHolder.getMap()を取得(注文番号).setResult(「注文発注成功」); mockQueue.setCompleteOrder(NULL )。 } 他{ 試みる{ の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 = 地図。 } }
図3に示すように、非同期処理構成