最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何使用ReentrantLock實現長輪詢

 更新時間:2021年04月08日 17:16:08   作者:NichenFly  
這篇文章主要介紹了如何使用ReentrantLock實現長輪詢,對ReentrantLock感興趣的同學,可以參考下

Java代碼

1. ReentrantLock

加鎖阻塞,一個condition對應一個線程,以便于喚醒時使用該condition一定會喚醒該線程

/**
     * 獲取探測點數據,長輪詢實現
     * @param messageId
     * @return
     */
    public JSONObject getToutData(String messageId) {
        Message message = toutMessageCache.get(messageId);
        if (message == null) {
            // 等待
            lock.lock();
            try {
                Condition condition = lock.newCondition();
                conditionMap.put(messageId + "_data", condition);
                condition.await(CONNECTION_HOLD_TIMEOUT, TimeUnit.SECONDS); // 等待60s
            } catch (InterruptedException e) {
                // 等待超時, do nothing
            } finally {
                lock.unlock();
            }
        }

        // 再次嘗試獲取
        message = toutMessageCache.get(messageId);
        if (message == null) {
            // 如果還沒有, 返回空對象
            return null;
        }

        byte[] bytes = message.getDataBytes();
        if (bytes == null) {
            return null;
        }
        String resStr = new String(bytes, StandardCharsets.UTF_8);
//        log.info("resStr: {}", resStr);
        JSONObject resObj;
        try {
            resObj = new JSONObject(resStr);
            resObj.put("invokeTime", DateUtil.format(new Date(resObj.getLong("invokeTime")), DatePattern.NORM_DATETIME_MS_PATTERN));
        } catch (Exception e) {
            resObj = new JSONObject();
        }

        return resObj;
    }

2. 回調

當異步數據返回,使用上一步的condition喚醒線程

public void callback(Message message) {
    String messageId = message.getId();
    toutMessageCache.put(message.getId(), message);
    String messageDataId = messageId + "_data";
    if (conditionMap.containsKey(messageDataId)) {
        lock.lock();
        try {
            Condition condition = conditionMap.get(messageDataId);
            condition.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
            conditionMap.remove(messageDataId);
        }
    }
}

3. 喚醒

執(zhí)行回調操作

public void distribute(Message message, ChannelHandlerContext ctx) {
   MessageType messageType = message.getMessageType();
   switch (messageType) {
       case TOUT_DATA_RESPONSE:
           // 數據響應
           toutService.callback(message);
           break;
   }

}

4. 調用

調用時,判斷返回的值是否為空,如果為空,與前端約定,當返回該狀態(tài)值時,應再次發(fā)起相同請求

/**
* 獲取探測數據(使用長輪詢實現)
* @param linkId
* @return
*/
@GetMapping("/data")
public ResultVO getToutData(String linkId) {
   JSONObject resObj = toutService.getToutData(linkId);
   if (resObj == null || resObj.isEmpty()) {
       return ResultVOUtil.error(ResultEnum.NO_MESSAGE_HOLD_CONNECTION);
   }
   return ResultVOUtil.success(resObj);
}

5.前端實現

簡單使用遞歸實現了當數據返回無效時再次發(fā)起請求

let that = this
function getData() {
     if (toutStatus === statusEnum.start) {
         getToutData({
             linkId
         }).then(res => {
             if (res.code === ERROR_CODE_OK) {
                 that.toutData = res.data
                 toutStatus = statusEnum.resData
                 that._btnStatus()
             } else {
                 getData()
             }
         })
     }
 }

 // 遞歸循環(huán)調用
 getData()

以上就是如何使用ReentrantLock實現長輪詢的詳細內容,更多關于ReentrantLock長輪詢的資料請關注腳本之家其它相關文章!

相關文章

  • Java格式化輸出詳細講解(printf、print、println、format等)

    Java格式化輸出詳細講解(printf、print、println、format等)

    Java的格式化輸出等同于String.Format,與C有很大的相似,下面這篇文章主要給大家介紹了關于Java格式化輸出(printf、print、println、format等)的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • Spring AOP統(tǒng)一功能處理示例代碼

    Spring AOP統(tǒng)一功能處理示例代碼

    AOP面向切面編程,它是一種思想,它是對某一類事情的集中處理,而AOP是一種思想,而Spring AOP是一個框架,提供了一種對AOP思想的實現,它們的關系和loC與DI類似,這篇文章主要介紹了Spring AOP統(tǒng)一功能處理示例代碼,需要的朋友可以參考下
    2023-01-01
  • RocketMq深入分析講解兩種削峰方式

    RocketMq深入分析講解兩種削峰方式

    當上游調用下游服務速率高于下游服務接口QPS時,那么如果不對調用速率進行控制,那么會發(fā)生很多失敗請求,通過消息隊列的削峰方法有兩種,這篇文章主要介紹了RocketMq深入分析講解兩種削峰方式
    2023-01-01
  • Mybatis 傳輸List的實現代碼

    Mybatis 傳輸List的實現代碼

    本文通過實例代碼給大家介紹了mybatis傳輸list的實現代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09
  • Java實現棧和隊列面試題

    Java實現棧和隊列面試題

    這篇文章主要介紹了Java實現棧和隊列的面試題,每個例題代碼實現非常詳細,每一個方法講解也很到位,特別適合參加Java面試的朋友閱讀。
    2015-09-09
  • 詳解Java中的三種流程控制語句

    詳解Java中的三種流程控制語句

    這篇文章主要介紹了Java中常用的三種流程控制語句的使用,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2022-04-04
  • java獲取本月日歷表的方法

    java獲取本月日歷表的方法

    這篇文章主要為大家詳細介紹了java獲取本月日歷表的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • idea導入項目不顯示maven側邊欄的問題及解決方法

    idea導入項目不顯示maven側邊欄的問題及解決方法

    這篇文章主要介紹了idea導入項目不顯示maven側邊欄的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 并發(fā)編程之Java內存模型鎖的內存語義

    并發(fā)編程之Java內存模型鎖的內存語義

    這篇文章主要介紹了并發(fā)編程之Java內存模型鎖的內存語義,鎖的作用是讓臨界區(qū)互斥執(zhí)行,本文只要圍繞鎖的內存語義展開全文內容,需要的小伙伴可以參考一下
    2021-11-11
  • java IO流文件的讀寫具體實例

    java IO流文件的讀寫具體實例

    這篇文章主要介紹了java IO流文件的讀寫具體實例,有需要的朋友可以參考一下
    2013-12-12

最新評論

松溪县| 横峰县| 阳城县| 抚松县| 库伦旗| 杭锦旗| 六安市| 黑龙江省| 萨嘎县| 汕头市| 金阳县| 吉木乃县| 曲水县| 炎陵县| 墨脱县| 高州市| 剑河县| 安丘市| 建阳市| 呼图壁县| 哈巴河县| 凌海市| 历史| 枣阳市| 宜良县| 通化县| 康平县| 延边| 巴里| 巴里| 榆林市| 西和县| 汕头市| 横山县| 繁昌县| 博客| 齐河县| 延安市| 黄石市| 古交市| 政和县|