日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot的DeferredResult案例:DeferredResult的超時處理方式

瀏覽:167日期:2023-03-29 14:50:45

DeferredResult的超時處理,采用委托機制,也就是在實例DeferredResult時給予一個超時時長(毫秒),同時在onTimeout中委托(傳入)一個新的處理線程(我們可以認為是超時線程);當超時時間到來,DeferredResult啟動超時線程,超時線程處理業(yè)務(wù),封裝返回數(shù)據(jù),給DeferredResult賦值(正確返回的或錯誤返回的)。

這個實例可以對上一個實例的代碼稍作改動即可。

一、增加超時處理任務(wù)TimeOutWork

package com.example; import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.context.request.async.DeferredResult; public class TimeOutWork implements Runnable{ private final Logger logger = LoggerFactory.getLogger(this.getClass()); private DeferredResult<ResponseMsg<String>> deferredResult; public TimeOutWork(DeferredResult<ResponseMsg<String>> deferredResult) { this.deferredResult = deferredResult; } @Override public void run() { logger.debug('我超時啦!'); ResponseMsg<String> msg = new ResponseMsg<String>(); msg.fail('我超時啦!'); //deferredResult.setResult(msg); deferredResult.setErrorResult(msg); }}二、DeferredResult請求中注冊超時任務(wù)處理

修改第一個請求,修改了兩處,請自己比較

package com.example; import java.util.HashMap;import java.util.Map; import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.context.request.async.DeferredResult; @RestController@RequestMapping('/api')public class DeferredRestController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final Map<Integer, DeferredResult<ResponseMsg<String>>> responseBodyMap = new HashMap<Integer, DeferredResult<ResponseMsg<String>>>(); private final Map<Integer, RequestMsg> requestBodyMap = new HashMap<Integer, RequestMsg>(); /** * 第一個請求 * * @param req * @return */ @RequestMapping('/request1') @ResponseBody public DeferredResult<ResponseMsg<String>> request1(RequestMsg req) { logger.debug('request1:請求參數(shù){}', req.getParam()); DeferredResult<ResponseMsg<String>> result =new DeferredResult<ResponseMsg<String>>(10000l);//10秒 result.onTimeout(new TimeOutWork(result));//超時任務(wù) requestBodyMap.put(1, req);// 把請求放到第一個請求map中 responseBodyMap.put(1, result);// 把請求響應(yīng)的DeferredResult實體放到第一個響應(yīng)map中 return result; } /** * 第二個請求 * * @param req * @return */ @RequestMapping('/request2') @ResponseBody public DeferredResult<ResponseMsg<String>> request2(RequestMsg req) { logger.debug('request2:請求參數(shù){}', req.getParam()); DeferredResult<ResponseMsg<String>> result = new DeferredResult<ResponseMsg<String>>(); requestBodyMap.put(2, req);// 把請求放到第二個請求map中 responseBodyMap.put(2, result);// 把請求響應(yīng)的DeferredResult實體放到第二個響應(yīng)map中 return result; } /** * 第三個請求 * * @param req * @return */ @RequestMapping('/request3') @ResponseBody public DeferredResult<ResponseMsg<String>> request3(RequestMsg req) { logger.debug('request3:請求參數(shù){}', req.getParam()); DeferredResult<ResponseMsg<String>> result = new DeferredResult<ResponseMsg<String>>(); requestBodyMap.put(3, req);// 把請求放到第三個請求map中 responseBodyMap.put(3, result);// 把請求響應(yīng)的DeferredResult實體放到第三個響應(yīng)map中 return result; } /** * 控制第x個請求執(zhí)行返回操作,同時自己也返回同樣的值 * * @param x * @return */ @RequestMapping(value = '/requestXReturn', method = RequestMethod.POST) @ResponseBody public ResponseMsg<String> request1Return(Integer x) { ResponseMsg<String> msg = new ResponseMsg<String>(); logger.debug('requestXReturn--1:請求參數(shù){}', x); DeferredResult<ResponseMsg<String>> result = responseBodyMap.get(x); if (result == null) { msg.fail('??!請求已經(jīng)釋放'); return msg; } String resultStr = 'result' + x.toString() + '. Received:' + requestBodyMap.get(x).getParam(); msg.success('成功', resultStr); result.setResult(msg);// 設(shè)置DeferredResult的結(jié)果值,設(shè)置之后,它對應(yīng)的請求進行返回處理 responseBodyMap.remove(x);// 返回map刪除 logger.debug('requestXReturn--2:請求參數(shù){}', x); logger.debug('requestXReturn--3:返回參數(shù){}', msg); return msg; }}三、修改頁面index.html

<script th:src='http://m.b3g6.com/bcjs/@{jquery-1.12.4.min.js}' type='text/javascript'></script> <script th:inline='javascript'> function button1RequestClick(){ var param=$('#request1RequestId').val(); $.ajax({ type:’post’, url:’/api/request1’, dataType : ’json’, data : { ’param’ : param }, success : function(data) { console.log(data); if (data.status==0){ $('#request1ResultId').val(data.data); } else { $('#request1ResultId').val(data.msg); } }, error : function(data) { console.log('button1RequestClick---error'); console.log(data); //alert('錯誤消息:' + data); } }); };

前后的代碼都省略了,其實僅僅修改了

if (data.status==0){ $('#request1ResultId').val(data.data);} else { $('#request1ResultId').val(data.msg);}四、小結(jié)

DeferredResult的超時處理比較簡單,定義時長及注冊一個處理Runnable實例即可。對于setResult、setErrorResult還需要繼續(xù)研究。

1、setResult

SpringBoot的DeferredResult案例:DeferredResult的超時處理方式

2、setErrorResult

SpringBoot的DeferredResult案例:DeferredResult的超時處理方式

3、isSetOrExpired

SpringBoot的DeferredResult案例:DeferredResult的超時處理方式

補充:解決了DeferredResult請求長時間占用數(shù)據(jù)庫連接的問題

最近看了看開源項目appllo配置中心的源碼,發(fā)現(xiàn)一個很有意思的東東:

(1)原理:由于使用了DeferredResult,根據(jù)Spring DispatcherServlet的默認邏輯,數(shù)據(jù)庫連接只有在異步請求真正返回給客戶端的時候才會釋放回連接池

(2)應(yīng)用場景:長連接時間很長,對于大部分請求可能都要數(shù)小時以上才會返回。在這么長的一段時間內(nèi)一直占用著數(shù)據(jù)庫連接是不合理的

長連接場景解決:

@Componentpublic class EntityManagerUtil extends EntityManagerFactoryAccessor { private static final Logger logger = LoggerFactory.getLogger(EntityManagerUtil.class); /** * close the entity manager. * Use it with caution! This is only intended for use with async request, which * Spring won’t close the entity manager until the async request is finished. */ public void closeEntityManager() { EntityManagerHolder emHolder = (EntityManagerHolder) TransactionSynchronizationManager.getResource(getEntityManagerFactory()); if (emHolder == null) { return; } logger.debug('Closing JPA EntityManager in EntityManagerUtil'); EntityManagerFactoryUtils.closeEntityManager(emHolder.getEntityManager()); }}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本综合精品一区| 久久国产人妖系列| 久久影院午夜精品| 日韩专区在线视频| 免费日韩一区二区三区| 国产午夜一区| 亚洲欧美在线专区| 亚洲一区欧美激情| 一本一本久久| 久久亚洲风情| 亚洲欧洲av| 国产亚洲久久| 欧美黑人巨大videos精品| 国产极品模特精品一二| 精品香蕉视频| 久久91视频| 日韩国产在线| 99国产精品久久久久久久| 亚洲最新av| 国产精品一级| 日韩国产综合| 国产日韩专区| 日韩av中文字幕一区二区三区| 国产精选一区| 国产不卡av一区二区| 日韩在线观看| 国产精品婷婷| 91精品国产自产精品男人的天堂| 国产精品一页| 日韩在线观看一区| 国产一在线精品一区在线观看| 亚洲激情二区| 日韩不卡一区二区三区 | 欧美一区二区三区高清视频| 午夜电影亚洲| 国内精品伊人| 欧美亚洲一区二区三区| 亚洲欧洲美洲国产香蕉| 国产精品网址| 精品亚洲美女网站| 视频一区二区国产| 国产精品男女| 欧洲av不卡| 亚洲图片久久| 国产欧美自拍一区| 日韩一区自拍| 日本不卡视频一二三区| 美女免费视频一区| 精品在线91| 欧美日韩中出| 久久国产主播| 亚洲精品第一| av在线资源| 亚洲精品系列| 日韩一区三区| 欧美一级网址| 亚洲成人精品| 久久精品国产99| 亚洲三级视频| 精品国产三区在线| 亚洲高清久久| 一区久久精品| 国产日产高清欧美一区二区三区| 黑丝一区二区三区| 香蕉久久99| 亚洲欧美日韩综合国产aⅴ| 天堂va在线高清一区| 色综合狠狠操| 在线精品视频在线观看高清| 日本视频在线一区| 秋霞国产精品| 青草久久视频| 亚洲综合中文| 日韩欧美精品| 四虎在线精品| 99热国内精品| 麻豆中文一区二区| 一区二区日韩免费看| 日韩中文视频| 久久亚洲资源中文字| 中文字幕亚洲精品乱码| 日韩成人三级| 久久99性xxx老妇胖精品| 亚洲香蕉视频| 国产专区一区| 91精品综合| 乱人伦精品视频在线观看| 亚洲不卡av不卡一区二区| 国产精品一区二区中文字幕| 欧美 日韩 国产一区二区在线视频 | 欧美精品自拍| 91一区二区三区四区| 国产亚洲观看| 亚洲久久视频| 91精品99| 麻豆精品蜜桃| 中文一区一区三区高中清不卡免费| 欧美精品国产| 亚洲精品无播放器在线播放| 色爱av综合网| 国精品产品一区| 欧美亚洲免费| 亚洲精品女人| 视频一区欧美日韩| 五月综合激情| 久久久久国产| 精品91福利视频| 国产情侣久久| 中文字幕成人| 国产精品美女久久久| 激情偷拍久久| 九九精品调教| 国产一区二区三区亚洲| 国产精品久久乐| 国产精品地址| 午夜欧美精品| 欧美久久久网站| 蜜臀va亚洲va欧美va天堂| 欧美日韩精品免费观看视欧美高清免费大片| 国产精品一区毛片| 日本免费一区二区视频| 在线一区欧美| 午夜精品一区二区三区国产| 另类中文字幕国产精品| 98精品视频| 国产成人精品一区二区三区免费| 久久精品午夜| 高潮久久久久久久久久久久久久| 国产精品日本一区二区不卡视频| 亚洲综合中文| 午夜精品婷婷| 日本不良网站在线观看| 亚洲欧洲美洲国产香蕉| 日韩精品三区四区| 日本中文字幕视频一区| 一区二区三区四区在线看| 精品日本视频| 国产一区二区三区免费在线 | 性色av一区二区怡红| 婷婷久久一区| 偷拍欧美精品| 亚洲91视频| 久久麻豆精品| 国产欧美日韩一区二区三区在线| 国产精品91一区二区三区| 欧美亚洲在线日韩| 午夜欧美精品| 免费不卡在线视频| 亚洲高清毛片| 国产精品午夜一区二区三区| 午夜亚洲精品| 老色鬼久久亚洲一区二区| 亚洲视频二区| 国产一卡不卡| 久久精品国产久精国产| 四虎8848精品成人免费网站| 日韩免费一区| 影院欧美亚洲| 亚洲精品大片| 一区二区电影| 国产精品久久久久毛片大屁完整版| 日本视频在线一区| 欧美激情日韩| 午夜欧美巨大性欧美巨大| 欧美日韩国产欧| 日本在线成人| 国产成人精品一区二区三区在线| 久久久精品网| 日本亚州欧洲精品不卡| 免费一级欧美在线观看视频| 人人精品亚洲| 亚洲日本免费电影| 精品国产午夜| 夜夜嗨av一区二区三区网站四季av| 一区二区91| 精品视频一区二区三区四区五区| 激情久久久久久| 精品一区二区三区亚洲| 精品三级av在线导航| 麻豆久久久久久久| 欧洲毛片在线视频免费观看| 日韩在线第七页| 亚洲在线观看| 国产精品欧美大片| 欧美日韩精品在线一区| 亚洲免费福利一区| 精品视频一区二区三区四区五区| av亚洲免费| 国产精品qvod| 色婷婷亚洲mv天堂mv在影片| 国产亚洲综合精品| 久久午夜影院| 快she精品国产999| 福利精品一区| 亚洲精品九九| 国产精品99免费看| 免费一级欧美片在线观看网站| 午夜电影亚洲| 国产一区二区三区亚洲| 伊人精品久久|