时间:2021-05-20
DeferredResult的超时处理,采用委托机制,也就是在实例DeferredResult时给予一个超时时长(毫秒),同时在onTimeout中委托(传入)一个新的处理线程(我们可以认为是超时线程);当超时时间到来,DeferredResult启动超时线程,超时线程处理业务,封装返回数据,给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; }}前后的代码都省略了,其实仅仅修改了
if (data.status==0){ $("#request1ResultId").val(data.data);} else { $("#request1ResultId").val(data.msg);}DeferredResult的超时处理比较简单,定义时长及注册一个处理Runnable实例即可。对于setResult、setErrorResult还需要继续研究。
1、setResult
2、setErrorResult
3、isSetOrExpired
补充:解决了DeferredResult请求长时间占用数据库连接的问题
最近看了看开源项目appllo配置中心的源码,发现一个很有意思的东东:
(1)原理:由于使用了DeferredResult,根据Spring DispatcherServlet的默认逻辑,数据库连接只有在异步请求真正返回给客户端的时候才会释放回连接池
(2)应用场景:长连接时间很长,对于大部分请求可能都要数小时以上才会返回。在这么长的一段时间内一直占用着数据库连接是不合理的
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
静态资源处理SpringBoot默认的处理方式就已经足够了,默认情况下SpringBoot使用WebMvcAutoConfiguration中配置的各种属性。建
可能是我开始处理问题的思路不对,现在描述问题可能也有点乱,但是里面可能的处理方式希望能帮到遇到我这个坑的人描述:springboot项目,docker镜像里面运
约定:importpandasaspdimportnumpyasnpfromnumpyimportnanasNaN填充缺失数据fillna()是最主要的处理方式
Word中进行精美的图形设计起到画龙点睛的作用,为此我们必须切实掌握图片处理方式,那么Word文档如何进行图片处理?下面小编就为大家介绍图片处理方式,来看看吧!
2、及时回复顾客的消息有些时候,某些店铺商家会采取"不作为"的处理方式,来应对顾客的负面评价。在这种思路下,客服对应的处理方式就是减少对负面评价的回复,甚至不回