DeferredResult之异步请求处理
2019-03-12 本文已影响9人
yellow_han
1、为什么使用DeferredResult
项目中我们某些接口有耗时操作,例如发送邮件、发送短信等有涉及调用的第三方接口的地方,因为第三方具有不确定性,可能耗时很久才会有数据返回。数据库某些慢查询。通常一些耗时且不必马上有返回结果的我们会采用消息中间件,例如 RabbitMQ、Disruptor等,但是有一些耗时但是又需要等待结果返回的,我们可以使用DeferredResult进行异步处理。以此提高我们服务器的性能。
2、实战
R为自定义的返回结果集
tomcat并发了大概在300到500,此接口被大量访问时若没进行异步处理,服务器资源一下子就会耗完。
@GetMapping("/test")
public DeferredResult<R> test(){
//设置10秒超时
DeferredResult deferredResult = new DeferredResult(10000L);
//模拟耗时操作
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
deferredResult.setResult(R.ok());
return deferredResult;
}
R.java
package com.gizhi.guns.core.util;
import com.gizhi.guns.core.enumeration.RetEnum;
import java.util.HashMap;
/**
* @description: 封装返回结果类
* @author: hs
* @create: 2018-09-21 22:42:04
**/
public class R<T> extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public R(int code,String msg) {
put("code", code);
put("msg", msg);
put("data", null);
put("error",false);
}
public static R fail() {
return new R(RetEnum.ERROR.getRet(),RetEnum.ERROR.getMsg());
}
public static R fail(String msg) {
return fail(RetEnum.ERROR.getRet(), msg);
}
public static R fail(int code, String msg) {
R r = new R(code,msg);
r.put("error",true);
r.put("data",null);
return r;
}
public static <T> R<T> fail(T data) {
R r = new R(RetEnum.ERROR.getRet(),RetEnum.ERROR.getMsg());
r.put("data",data);
r.put("error",true);
return r;
}
public static <T> R<T> fail(int code,String msg,T data) {
R r = new R(code,msg);
r.put("data",data);
r.put("error",true);
return r;
}
public static R ok() {
return new R(RetEnum.SUCCESS.getRet(),RetEnum.SUCCESS.getMsg());
}
public static R ok(String msg) {
R r = new R(RetEnum.SUCCESS.getRet(),msg);
r.put("data",msg);
r.put("error",false);
return r;
}
public static R ok(int code, String msg) {
R r = new R(code,msg);
r.put("code", code);
r.put("msg", msg);
r.put("data", null);
r.put("error",false);
return r;
}
public static <T> R<T> ok(T data) {
R r = new R(RetEnum.SUCCESS.getRet(),RetEnum.SUCCESS.getMsg());
r.put("data",data);
r.put("error",false);
return r;
}
public static <T> R<T> ok(int code,String msg,T data) {
R r = new R(code,msg);
r.put("data",data);
r.put("error",false);
return r;
}
@Override
public R put(String key, Object value) {
super.put(key, value);
return this;
}
}