Java基础

DeferredResult之异步请求处理

2019-03-12  本文已影响9人  yellow_han

1、为什么使用DeferredResult

项目中我们某些接口有耗时操作,例如发送邮件、发送短信等有涉及调用的第三方接口的地方,因为第三方具有不确定性,可能耗时很久才会有数据返回。数据库某些慢查询。通常一些耗时且不必马上有返回结果的我们会采用消息中间件,例如 RabbitMQDisruptor等,但是有一些耗时但是又需要等待结果返回的,我们可以使用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;
    }


}

3、关注我的公众号,互相学习。

image.png
上一篇 下一篇

猜你喜欢

热点阅读