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

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

SpringBoot的DeferredResult案例:DeferredResult的超時(shí)處理方式

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

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

這個(gè)實(shí)例可以對上一個(gè)實(shí)例的代碼稍作改動即可。

一、增加超時(shí)處理任務(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('我超時(shí)啦!'); ResponseMsg<String> msg = new ResponseMsg<String>(); msg.fail('我超時(shí)啦!'); //deferredResult.setResult(msg); deferredResult.setErrorResult(msg); }}二、DeferredResult請求中注冊超時(shí)任務(wù)處理

修改第一個(gè)請求,修改了兩處,請自己比較

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>(); /** * 第一個(gè)請求 * * @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));//超時(shí)任務(wù) requestBodyMap.put(1, req);// 把請求放到第一個(gè)請求map中 responseBodyMap.put(1, result);// 把請求響應(yīng)的DeferredResult實(shí)體放到第一個(gè)響應(yīng)map中 return result; } /** * 第二個(gè)請求 * * @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);// 把請求放到第二個(gè)請求map中 responseBodyMap.put(2, result);// 把請求響應(yīng)的DeferredResult實(shí)體放到第二個(gè)響應(yīng)map中 return result; } /** * 第三個(gè)請求 * * @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);// 把請求放到第三個(gè)請求map中 responseBodyMap.put(3, result);// 把請求響應(yīng)的DeferredResult實(shí)體放到第三個(gè)響應(yīng)map中 return result; } /** * 控制第x個(gè)請求執(zhí)行返回操作,同時(shí)自己也返回同樣的值 * * @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)的請求進(jìn)行返回處理 responseBodyMap.remove(x);// 返回map刪除 logger.debug('requestXReturn--2:請求參數(shù){}', x); logger.debug('requestXReturn--3:返回參數(shù){}', msg); return msg; }}三、修改頁面index.html

<script th:src='http://www.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); } }); };

前后的代碼都省略了,其實(shí)僅僅修改了

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

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

1、setResult

SpringBoot的DeferredResult案例:DeferredResult的超時(shí)處理方式

2、setErrorResult

SpringBoot的DeferredResult案例:DeferredResult的超時(shí)處理方式

3、isSetOrExpired

SpringBoot的DeferredResult案例:DeferredResult的超時(shí)處理方式

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

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

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

(2)應(yīng)用場景:長連接時(shí)間很長,對于大部分請求可能都要數(shù)小時(shí)以上才會返回。在這么長的一段時(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()); }}

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

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲毛片在线| 欧美日韩一区二区综合| 精品国产第一福利网站| 久久精品国内一区二区三区| 欧美日韩中出| 国产精品久久久久77777丨 | 精品视频亚洲| 国产粉嫩在线观看| 国产一区日韩欧美| 国产午夜精品一区二区三区欧美 | 亚洲视频电影在线| 国产日韩免费| 日韩电影免费网站| 久久婷婷久久| 99国产精品99久久久久久粉嫩| 尹人成人综合网| 国产精品手机在线播放| 日韩av中文在线观看| 麻豆精品av| 日韩一区二区久久| 好看不卡的中文字幕| 国产精品毛片在线看| 国产乱人伦精品一区| 国产精品一区二区三区av| av中文资源在线资源免费观看| 中文字幕高清在线播放| 中文av在线全新| 亚洲精选成人| 福利一区二区| 石原莉奈在线亚洲三区| 国产乱码精品一区二区三区四区 | 国产亚洲一区二区手机在线观看| 精品亚洲二区| 首页欧美精品中文字幕| 久久久精品国产**网站| 日av在线不卡| 国产成人免费| 亚洲a级精品| 色黄视频在线观看| 欧美一区精品| 视频在线在亚洲| 免费看av不卡| 久久久久黄色| 欧美一区久久| 亚洲另类视频| 午夜一级久久| 欧美69视频| 三级在线看中文字幕完整版| 国产区精品区| 欧美日韩网址| av资源亚洲| 久久影院资源站| 国产精品香蕉| 久久精品91| 国产精品永久| 精品一区二区三区视频在线播放 | 国产日韩欧美三级| 婷婷视频一区二区三区| 午夜在线精品偷拍| 亚洲免费中文| 视频在线观看一区二区三区| 红桃视频国产一区| 性一交一乱一区二区洋洋av| 亚洲自啪免费| 亚洲另类黄色| 亚洲精品高潮| 日韩精品福利一区二区三区| 国产黄大片在线观看| 日韩午夜高潮| 九色porny丨国产首页在线| 亚洲精品少妇| 日韩国产一区二| 欧美日韩va| 精品日本视频| 午夜欧美巨大性欧美巨大| 日韩精品免费一区二区在线观看 | 亚洲精品影院在线观看| 亚洲资源网站| 国产日韩欧美三级| 麻豆mv在线观看| 女主播福利一区| 日韩视频1区| 精品国产免费人成网站| 欧美日韩国产精品一区二区亚洲| 亚洲久久一区| 久久国产尿小便嘘嘘| 国产精品原创| 丝袜美腿高跟呻吟高潮一区| 日韩高清在线不卡| 亚洲黄色网址| 亚洲天堂av资源在线观看| 97久久亚洲| 精品国模一区二区三区| 免费视频一区二区| 亚洲精品福利电影| 午夜视频一区二区在线观看| av日韩中文| 国产欧美日韩一级| 国产女优一区| 欧美日韩在线观看首页| 亚洲字幕久久| 在线日韩中文| 精品国产亚洲一区二区三区在线 | 欧美日韩1区| 激情欧美一区| 精品视频国产| 综合欧美亚洲| 久久九九电影| 精品网站999| 蜜臀久久99精品久久久久久9| 精品国产美女a久久9999| 中文一区一区三区免费在线观 | 欧美日中文字幕| 免费日韩成人| 一区二区精彩视频| 1024精品久久久久久久久| 里番精品3d一二三区| 亚洲久久视频| 不卡中文字幕| www.com.cn成人| 国产精品99一区二区| 国产毛片精品| 久久激情五月激情| 日韩 欧美一区二区三区| 国产亚洲网站| 国产精品久久久久久久久妇女| 国产成人在线中文字幕| 国产精品视频一区视频二区| 亚洲一区二区网站| 国产精品99精品一区二区三区∴| 亚洲免费影院| 人人爽香蕉精品| 午夜精品影视国产一区在线麻豆| 亚州av乱码久久精品蜜桃| 在线看片不卡| 日本一区二区中文字幕| 国产一精品一av一免费爽爽| 国产精品一区二区三区av| 麻豆成人av在线| 日韩国产专区| 亚洲精品电影| 91伊人久久| 麻豆久久一区二区| 欧美一区久久久| 精品日韩毛片| 日韩精品亚洲aⅴ在线影院| 欧美三区不卡| av在线资源| 99久久99视频只有精品| 久久大逼视频| 国产精品一线天粉嫩av| 日韩国产一区二区三区| 老牛影视一区二区三区| 国产免费久久| 欧美日韩中文字幕一区二区三区 | 国产欧美日韩精品一区二区免费 | 日韩中文字幕| 国产粉嫩在线观看| 老司机精品久久| 精品视频在线观看网站| 在线精品视频在线观看高清| 日韩avvvv在线播放| 亚洲高清二区| 久久精品三级| 蜜桃视频在线观看一区| 国产一区二区三区网| 中文字幕av一区二区三区四区| 高清久久一区| 欧美日韩一区二区三区四区在线观看| 日韩欧美网址| 久久精品人人| 亚洲69av| 一级欧洲+日本+国产| 福利一区在线| 国产精品成人自拍| 亚洲永久字幕| 国产精品成人一区二区不卡| 日韩高清欧美激情| 亚洲资源网站| 亚洲一区二区三区无吗| 99久久九九| 日韩欧美视频专区| 美腿丝袜在线亚洲一区| 日本午夜精品视频在线观看| 综合激情网...| 免费在线看一区| 另类av一区二区| 欧美日韩免费观看一区=区三区 | 精品国产美女a久久9999| 日本不卡在线视频| 免费在线观看日韩欧美| 水野朝阳av一区二区三区| 尹人成人综合网| 欧美日韩免费观看一区=区三区 | 婷婷亚洲五月| 久久精品国产99久久| 日韩另类视频| 黄色在线观看www| 久久人人97超碰国产公开结果| 日韩欧美在线中字|