栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记OkHttpClient 踩的坑

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记OkHttpClient 踩的坑

某次运营搞活动,端口耗尽,内存溢出,查代码,原来是OkHttpClient没有单列导致。

原代码:

pom


            com.squareup.okhttp3
            okhttp
            4.2.1
        
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

@Slf4j
public class HttpClient {

    public static final String  REQUESTBODY_MEDIATYPE="application/json; charset=utf-8";
    public static final String  REQUESTPARAM_MEDIATYPE="application/x-www-form-urlencoded; charset=utf-8";
    public static final String  REQUESTBODYXML_MEDIATYPE="application/xml; charset=utf-8";
    public static final Integer  DEFUAL_TIME_OUT= 5;

    
    public static Optional doPost(String url, String json) {
        return doPost(url, json,REQUESTPARAM_MEDIATYPE,null, DEFUAL_TIME_OUT);
    }

    
    public static Optional doPost(String url, String json, Integer timeout) {
        return doPost(url, json,REQUESTPARAM_MEDIATYPE,null, timeout);
    }

    
    public static Optional doPost(String url, String json,Map headersParams) {
        return doPost(url, json,REQUESTPARAM_MEDIATYPE,headersParams, DEFUAL_TIME_OUT);
    }

    
    public static Optional doPost(String url, String json,String requestType){
        return doPost(url, json,requestType,null, DEFUAL_TIME_OUT);
    }

    public static Optional doPost(String url, String json,String requestType,Map headersParams){
        return doPost(url, json,requestType,headersParams, DEFUAL_TIME_OUT);
    }

    
    public static Optional doPost(String url, String json,String requestType,Map headersParams, Integer timeout) {
        MediaType mediaType=MediaType.parse(requestType);
        OkHttpClient httpClient = new OkHttpClient().newBuilder().connectTimeout(timeout, TimeUnit.SECONDS).readTimeout(timeout, TimeUnit.SECONDS).build();
        RequestBody body = RequestBody.create(mediaType,json);
        Request request = new Request.Builder()
                .url(url)
                .post(body).headers(setHeaders(headersParams))
                .build();
        try (Response response = httpClient.newCall(request).execute()) {
            return Optional.of(response.body().string());
        } catch (Exception e) {
            log.error("post 请求 【" + url + "] 异常, 入参 [" + json + "]", e);
        }
        return Optional.empty();
    }


    public static Optional doPostXml(String url, String xmlString) {
        RequestBody body=RequestBody.create(MediaType.parse(REQUESTBODYXML_MEDIATYPE), xmlString);
        OkHttpClient httpClient = new OkHttpClient().newBuilder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS).build();
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        try (Response response = httpClient.newCall(request).execute()) {
            return Optional.of(response.body().string());
        } catch (Exception e) {
            log.error("post 请求 【" + url + "] 异常, 入参 [" + xmlString + "]", e);
        }
        return Optional.empty();
    }

    
    private static Headers setHeaders(Map headersParams){
        Headers headers = null;
        Headers.Builder headerBuilder = new Headers.Builder();
        if(headersParams != null){
            for (String key:headersParams.keySet()){
                headerBuilder.add(key,headersParams.get(key).toString());
            }
        }
        headers = headerBuilder.build();

        return headers;
    }

    
    public static Optional get(String url) {
        OkHttpClient httpClient = new OkHttpClient().newBuilder().connectTimeout(DEFUAL_TIME_OUT, TimeUnit.SECONDS).readTimeout(DEFUAL_TIME_OUT, TimeUnit.SECONDS).build();

        Request request = new Request.Builder().url(url).build();
        try (Response response = httpClient.newCall(request).execute()) {
            return Optional.of(response.body().string());
        } catch (Exception e) {
            log.error("get 请求 【" + url + "] 异常", e);
        }
        return Optional.empty();
    }


    public static String getQueryString(Map params) {
        if (params == null) {
            return null;
        } else {
            String q = "";
            int i = 0;
            Iterator var3 = params.entrySet().iterator();

            while(var3.hasNext()) {
                Map.Entry param = (Map.Entry)var3.next();

                try {
                    q = q + param.getKey() + "=" + URLEncoder.encode(param.getValue()==null?"":param.getValue().toString(), "utf-8");
                } catch (UnsupportedEncodingException var6) {
                    ;
                }

                ++i;
                if (i != params.size()) {
                    q = q + "&";
                }
            }

            return q;
        }
    }

    public static String getQueryObject(Map params) {
        if (params == null) {
            return null;
        } else {
            String q = "";
            int i = 0;
            Iterator var3 = params.entrySet().iterator();

            while(var3.hasNext()) {
                Map.Entry param = (Map.Entry)var3.next();

                try {

                    if (param.getValue() instanceof Collection) {
                        for (Object s : (Collection)param.getValue()) {
                            q = q + param.getKey() + "=" + URLEncoder.encode(param.getValue()==null?"":s.toString(), "utf-8");
                        }
                    } else {
                        q = q + param.getKey() + "=" + URLEncoder.encode(param.getValue()==null?"":param.getValue().toString(), "utf-8");
                    }
                } catch (UnsupportedEncodingException var6) {
                    ;
                }
                ++i;
                if (i != params.size()) {
                    q = q + "&";
                }
            }

            return q;
        }
    }
}

修改后:

import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.TimeUnit;


@Slf4j
public class HttpClient {

    public static final String  REQUESTBODY_MEDIATYPE="application/json; charset=utf-8";
    public static final String  REQUESTPARAM_MEDIATYPE="application/x-www-form-urlencoded; charset=utf-8";
    public static final String  REQUESTBODYXML_MEDIATYPE="application/xml; charset=utf-8";
    public static final Integer  DEFUAL_TIME_OUT= 5;

    
    public static Optional doPost(String url, String json) {
        return doPost(url, json,REQUESTPARAM_MEDIATYPE,null, DEFUAL_TIME_OUT);
    }

    
    public static Optional doPost(String url, String json, Integer timeout) {
        return doPost(url, json,REQUESTPARAM_MEDIATYPE,null, timeout);
    }

    
    public static Optional doPost(String url, String json,Map headersParams) {
        return doPost(url, json,REQUESTPARAM_MEDIATYPE,headersParams, DEFUAL_TIME_OUT);
    }

    
    public static Optional doPost(String url, String json,String requestType){
        return doPost(url, json,requestType,null, DEFUAL_TIME_OUT);
    }

    public static Optional doPost(String url, String json,String requestType,Map headersParams){
        return doPost(url, json,requestType,headersParams, DEFUAL_TIME_OUT);
    }

    
    public static Optional doPost(String url, String json,String requestType,Map headersParams, Integer timeout) {
        MediaType mediaType=MediaType.parse(requestType);
        RequestBody body = RequestBody.create(mediaType,json);
        Request request = new Request.Builder()
                .url(url)
                .post(body).headers(setHeaders(headersParams))
                .build();
        try (Response response = OkHttpUtil.getInstance().newCall(request).execute()) {
            return Optional.of(response.body().string());
        } catch (Exception e) {
            log.error("post 请求 【" + url + "] 异常, 入参 [" + json + "]", e);
        }
        return Optional.empty();
    }


    public static Optional doPostXml(String url, String xmlString) {
        RequestBody body=RequestBody.create(MediaType.parse(REQUESTBODYXML_MEDIATYPE), xmlString);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        try (Response response = OkHttpUtil.getInstance().newCall(request).execute()) {
            return Optional.of(response.body().string());
        } catch (Exception e) {
            log.error("post 请求 【" + url + "] 异常, 入参 [" + xmlString + "]", e);
        }
        return Optional.empty();
    }

    
    private static Headers setHeaders(Map headersParams){
        Headers headers = null;
        Headers.Builder headerBuilder = new Headers.Builder();
        if(headersParams != null){
            for (String key:headersParams.keySet()){
                headerBuilder.add(key,headersParams.get(key).toString());
            }
        }
        headers = headerBuilder.build();

        return headers;
    }

    
    public static Optional get(String url) {
        Request request = new Request.Builder().url(url).build();
        try (Response response = OkHttpUtil.getInstance().newCall(request).execute()) {
            return Optional.of(response.body().string());
        } catch (Exception e) {
            log.error("get 请求 【" + url + "] 异常", e);
        }
        return Optional.empty();
    }


    public static String getQueryString(Map params) {
        if (params == null) {
            return null;
        } else {
            String q = "";
            int i = 0;
            Iterator var3 = params.entrySet().iterator();

            while(var3.hasNext()) {
                Map.Entry param = (Map.Entry)var3.next();

                try {
                    q = q + param.getKey() + "=" + URLEncoder.encode(param.getValue()==null?"":param.getValue().toString(), "utf-8");
                } catch (UnsupportedEncodingException var6) {
                    ;
                }

                ++i;
                if (i != params.size()) {
                    q = q + "&";
                }
            }

            return q;
        }
    }

    public static String getQueryObject(Map params) {
        if (params == null) {
            return null;
        } else {
            String q = "";
            int i = 0;
            Iterator var3 = params.entrySet().iterator();

            while(var3.hasNext()) {
                Map.Entry param = (Map.Entry)var3.next();

                try {

                    if (param.getValue() instanceof Collection) {
                        for (Object s : (Collection)param.getValue()) {
                            q = q + param.getKey() + "=" + URLEncoder.encode(param.getValue()==null?"":s.toString(), "utf-8");
                        }
                    } else {
                        q = q + param.getKey() + "=" + URLEncoder.encode(param.getValue()==null?"":param.getValue().toString(), "utf-8");
                    }
                } catch (UnsupportedEncodingException var6) {
                    ;
                }
                ++i;
                if (i != params.size()) {
                    q = q + "&";
                }
            }

            return q;
        }
    }
}

单列化:

import okhttp3.OkHttpClient;

import java.util.concurrent.TimeUnit;


public class OkHttpUtil {

    private static OkHttpClient singleton;
    public static final Integer  DEFAULT_TIME_OUT= 7;

    private OkHttpUtil() {

    }


    public static OkHttpClient getInstance() {
        if (singleton == null) {
            synchronized (OkHttpUtil.class) {
                if (singleton == null) {
                    singleton = new OkHttpClient()
                            .newBuilder()
                            .connectTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS)
                            .readTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS)
                            .writeTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS)
                            .build();
                }
            }
        }
        return singleton;
    }

}

参考地址:OkHttp使用踩坑记录总结(一):OkHttpClient单例和长连接Connection Keep-Alive_wds的博客-CSDN博客_okhttpclient 单例

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/750568.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号