国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

更多QQ空间微信QQ好友腾讯朋友复制链接
您的位置:首頁/技術文章
文章詳情頁

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

【字号: 作者:豬豬瀏覽:64日期:2023-03-29 14:50:45

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

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

一、增加超時處理任務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請求中注冊超時任務處理

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

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:請求參數{}', req.getParam()); DeferredResult<ResponseMsg<String>> result =new DeferredResult<ResponseMsg<String>>(10000l);//10秒 result.onTimeout(new TimeOutWork(result));//超時任務 requestBodyMap.put(1, req);// 把請求放到第一個請求map中 responseBodyMap.put(1, result);// 把請求響應的DeferredResult實體放到第一個響應map中 return result; } /** * 第二個請求 * * @param req * @return */ @RequestMapping('/request2') @ResponseBody public DeferredResult<ResponseMsg<String>> request2(RequestMsg req) { logger.debug('request2:請求參數{}', req.getParam()); DeferredResult<ResponseMsg<String>> result = new DeferredResult<ResponseMsg<String>>(); requestBodyMap.put(2, req);// 把請求放到第二個請求map中 responseBodyMap.put(2, result);// 把請求響應的DeferredResult實體放到第二個響應map中 return result; } /** * 第三個請求 * * @param req * @return */ @RequestMapping('/request3') @ResponseBody public DeferredResult<ResponseMsg<String>> request3(RequestMsg req) { logger.debug('request3:請求參數{}', req.getParam()); DeferredResult<ResponseMsg<String>> result = new DeferredResult<ResponseMsg<String>>(); requestBodyMap.put(3, req);// 把請求放到第三個請求map中 responseBodyMap.put(3, result);// 把請求響應的DeferredResult實體放到第三個響應map中 return result; } /** * 控制第x個請求執行返回操作,同時自己也返回同樣的值 * * @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:請求參數{}', x); DeferredResult<ResponseMsg<String>> result = responseBodyMap.get(x); if (result == null) { msg.fail('??!請求已經釋放'); return msg; } String resultStr = 'result' + x.toString() + '. Received:' + requestBodyMap.get(x).getParam(); msg.success('成功', resultStr); result.setResult(msg);// 設置DeferredResult的結果值,設置之后,它對應的請求進行返回處理 responseBodyMap.remove(x);// 返回map刪除 logger.debug('requestXReturn--2:請求參數{}', x); logger.debug('requestXReturn--3:返回參數{}', msg); return msg; }}三、修改頁面index.html

<script th:src='http://www.cgvv.com.cn/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);}四、小結

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

1、setResult

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

2、setErrorResult

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

3、isSetOrExpired

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

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

最近看了看開源項目appllo配置中心的源碼,發現一個很有意思的東東:

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

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

長連接場景解決:

@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()); }}

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

標簽: Spring
相關文章:
主站蜘蛛池模板: 国产男女爽爽爽爽爽视频 | 精品国产香蕉伊思人在线 | 一本色道久久综合亚洲精品 | 97在线免费看视频 | 亚洲一区二区天海翼 | 日韩a毛片| 久草在线最新视频 | 一级黄色毛片免费看 | 亚洲一区二区三区欧美 | 亚洲视频免费在线看 | 在线播放人成午夜免费视频 | 国产乱码一区二区三区四 | 久久精品国产只有精品6 | 国产极品一区 | 女人让男人桶的小视频 | 韩国一级特黄毛片大 | 九九九在线视频 | 国产成人a大片大片在线播放 | 亚洲国产www | 成年人三级黄色片 | 美女大片高清特黄a大片 | 最爽的乱淫片免费 | 一级啊片| 欧美特级午夜一区二区三区 | 日本三级香港三级网站 | 欧美日韩精品一区二区三区视频 | 黄到让你下面湿的视频 | 久久久久久久久久毛片精品美女 | 欧美成人老熟妇暴潮毛片 | 日本护士一级毛片在线播放 | 国产高清亚洲精品26u | 华人色 | 国产精品网站 夜色 | 日韩毛片免费在线观看 | 中文字幕 亚洲精品 第1页 | 高清国产一级精品毛片基地 | 欧美精品久久久久久久免费观看 | 91青草久久久久久清纯 | 99久久精品国产自免费 | 免费一级视频在线播放 | 亚洲国产成人久久一区久久 |