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( "メインスレッド開始" )、

        呼び出し可能 <ストリング>結果= 新しい新しい呼び出し可能の<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に示すように、非同期処理構成

おすすめ

転載: www.cnblogs.com/maple92/p/11616472.html