グアバ限流

<! - Googleのグアバ限流- > 
<依存>
<groupIdを> com.google.guava </ groupIdを>
<たartifactId>グアバ</たartifactId>
<バージョン> 23.0 </バージョン>
</依存関係>

パッケージcom.yung.user.util。

輸入com.google.common.util.concurrent.RateLimiter。
輸入com.yung.user.dto.HttpResult。
輸入org.apache.commons.collections.MapUtils。
輸入org.apache.commons.httpclient.HttpClient。
輸入org.apache.commons.httpclient.HttpException。
輸入org.apache.commons.httpclient.MultiThreadedHttpConnectionManager。
輸入org.apache.commons.httpclient.methods.GetMethod; 
輸入org.apache.commons.httpclient.methods.PostMethod; 
輸入org.apache.commons.lang3.StringUtils。
輸入org.slf4j.Logger。
輸入org.slf4j.LoggerFactory; 

インポートにjava.io.IOException; 
輸入java.util.Map; 
輸入java.util.Set;
輸入java.util.concurrent.TimeUnit。

/ **
 * HTTP请求工具类
 * / 
publicクラスHttpUtil { 
    民間最終静的ロガーロガー= LoggerFactory.getLogger(HttpUtil.class)。

    プライベート静的最終文字列URL_PARAM_CONNECT_EQUAL_SIGN =「=」; 
    プライベート静的最終文字列URL_PARAM_CONNECT_FLAG =「&」; 
    プライベート静的最後の文字列HTTP_CONTENT_TYPE_KEY =「ContentTypeを」; 

    プライベート静的MultiThreadedHttpConnectionManagerのConnectionManager = NULL; 
    / ** 
     *连接超时时间
     * / 
    プライベート静的int型のConnectionTimeout = 2000; 
    / ** 
     *响应超时时间
     * / 
    プライベート静的int型socketTimeOut = 2000; 
    / ** 
     *最大接続数
     * /
    プライベート静的int型maxConnectionPerHost = 30; 
    / ** 
     *最大活动连接数
     * / 
    プライベート静的int型maxTotalConnections = 30; 

    プライベート静的HttpClientをクライアント。

    / ** 
     *令牌桶限流
     *每秒产生300个令牌
     * / 
    プライベート静的RateLimiter rateLimiter = RateLimiter.create(300); 

    静的{ 
        のConnectionManager =新しいMultiThreadedHttpConnectionManager()。
        connectionManager.getParams()setConnectionTimeout(のConnectionTimeout)。
        connectionManager.getParams()setSoTimeout(socketTimeOut)。 
        connectionManager.getParams() .setDefaultMaxConnectionsPerHost(maxConnectionPerHost)。
        connectionManager.getParams()setMaxTotalConnections(maxTotalConnections)。
        =新しい新しいHttpClientをクライアント(のConnectionManager); 
    } 

    / ** 
     データ提出する* POSTメソッド
     * @paramのURL URLは、要求される
     提出するデータを* @paramはparamsは
     * @return応答結果
     * / 
    パブリック静的HttpResultのdoPost(文字列のURL、地図を<文字列、文字列>のparams){ 
        //トークンを取得1秒なしのアクセスを拒否。
        (rateLimiter.tryAcquire(1、TimeUnit.SECONDS。!)){IF 
            スロー新しい新BusinessException(ErrorStatus.GET_LIMIT_TOKEN_FAIL_ERROR); 
        } 

        HttpResult新しい新しいHttpResult結果=() ; 
        PostMethod PostMethod = NULL; 
            IF(StringUtils.isEmpty(params.get(HTTP_CONTENT_TYPE_KEY))){ 
        試み{
            postMethod =新しいPostMethod(URL); 
                postMethod.setRequestHeader( "のContent-Type"、 "アプリケーション/ x-www-form-urlencodedで;のcharset = UTF8")。
            } 

            IF(MapUtils.isNotEmpty(paramsは)){ 
                設定<のMap.Entry <文字列、文字列>>エントリ= params.entrySet()。
                (のMap.Entry <文字列、文字列>エントリ:エントリ)のために{ 
                    postMethod.addParameter(entry.getKey()、entry.getValue())。
                } 
            } 

            client.executeMethod(postMethod)。
            result.setStatusCode(postMethod.getStatusCode())。
            result.setData(postMethod.getResponseBodyAsString())。 
            LOGGER.error( "致命的な例外が発生し、プロトコルは、問題またはコンテンツ・リターンではないかもしれない"、E)。
        }キャッチ(IOExceptionを電子){ 
            LOGGER.error(E "例外がネットワークに発生"); 
        }最後に、{ 
            (PostMethod = NULL!)IF { 
                PostMethod .releaseConnection(); 
            } 
        } 
        戻り値の結果; 
    } 


    / ** 
     データ提出する* GETメソッド
     * @paramのURL URLを要求する
     * @param paramsは提出するデータ
     * @return応答結果
     * / 
    、パブリック静的HttpResultのdoGet(文字列のURLをマップ<文字列、文字列>のparams){ 
        //トークンを取得1秒なしのアクセスを拒否。
        (rateLimiter.tryAcquire(1、TimeUnit.SECONDS。!)){IF 
            スロー新しい新BusinessException(ErrorStatus.GET_LIMIT_TOKEN_FAIL_ERROR)。
        } 

        HttpResult結果=新しいHttpResult()。
        GetMethod getMethod = NULL; 

        ストリングhttpGetParamsStr = getHttpGetParamsStr(paramsは)。
        もし(StringUtils.isNotEmpty(httpGetParamsStr)){ 
            URL = URL + "?" + httpGetParamsStr; 
        } 
        {試みる
            getMethod =新しいGetMethod(URL)を。
            IF(StringUtils.isEmpty(params.get(HTTP_CONTENT_TYPE_KEY))){ 
                getMethod.setRequestHeader( "のContent-Type"、 "アプリケーション/ x-www-form-urlencodedで;のcharset = UTF8")。
            } 

            client.executeMethod(getMethod)。
            result.setStatusCode(getMethod.getStatusCode())。
            result.setData(getMethod.getResponseBodyAsString())。
        }キャッチ(HttpException E){  
            LOGGER.error(例えば、「致命的な例外が発生し、プロトコルは、問題またはコンテンツ・リターンではないかもしれません」)。
        }キャッチ(IOExceptionを電子){
            LOGGER.error( "发生网络异常"、E)。
        }最後に、{ 
            (!getMethod = NULL)であれば{ 
                getMethod.releaseConnection()。
            } 
        } 

        戻り値の結果; 
    } 

    / ** 
     *获取GET请求参数字符串
     * @paramはparamsは
     * @return 
     * / 
    プライベート静的な文字列getHttpGetParamsStr(地図<文字列、文字列>のparams){ 
        場合(MapUtils.isEmpty(のparams)){ 
            nullを返します。
        } 
        のStringBuilderビルダー=新規のStringBuilder();
        セット<のMap.Entry <文字列、文字列>>エントリー= params.entrySet(); 
        int型私= 0; 
        (のMap.Entry <文字列、文字列>エントリ:エントリ)のために{
            。builder.append(entry.getKey())付加(URL_PARAM_CONNECT_EQUAL_SIGN).append(entry.getValue())。
            IF(!I = entries.size() - 1){ 
                builder.append(URL_PARAM_CONNECT_FLAG)。
            } 
            私は++します; 
        } 
        )(builder.toStringを返します。
    } 
}

  

おすすめ

転載: www.cnblogs.com/zfzf1/p/10951446.html