ppgjx 发表于 2023-6-7 08:45

这是okhttp的bug吗?(已解决)

本帖最后由 ppgjx 于 2023-6-7 11:28 编辑


如图 语句已经执行到最后一个输出语句 后面没有任何代码 但是这个main函数没有结束 还是一直在运行中
这是maven
<dependency>    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.14.9</version>
</dependency>
下面是代码 而且我发现只要请求 https://api.appstoreconnect.apple.com/v1/apps 这个网址就会卡主 请求百度则不会

已解决 确实是okhttp的bug 升级maven版本到4.1这个问题就没复现了

import okhttp3.*;

import javax.script.ScriptException;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.Proxy;

import java.util.*;
import java.util.concurrent.TimeUnit;


public class TextTo {

    public static void main(String[] args) throws Exception {
      OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
      MediaType mediaType = MediaType.parse("text/plain");
      MediaType JSON = MediaType.parse("application/json; charset=utf-8");
      RequestBody body = RequestBody.create(JSON, "{}");
      Request request = new Request.Builder()
                .url("https://api.appstoreconnect.apple.com/v1/apps")
                .method("POST", body)
                .build();
      Response response = client.newCall(request).execute();
      System.out.println("执行结束");
    }


}

天王盖地虎a 发表于 2023-6-7 08:59

应该要在headers中添加身份验证信息

isiyuan 发表于 2023-6-7 09:22

接口是有鉴权和防刷的

lsy_loren 发表于 2023-6-7 09:29

没直接用过OkHttpClient,使用Springboot都是直接使用RestTemplate的

ppgjx 发表于 2023-6-7 09:30

isiyuan 发表于 2023-6-7 09:22
接口是有鉴权和防刷的

问题是 他接口不管成功还是失败 这个main方法都应该会结束 而不是卡主

a142536 发表于 2023-6-7 09:33

OkHttpClient 还存活着了吧

QingTianGG 发表于 2023-6-7 09:38

是不是要手动关闭

fanchenio 发表于 2023-6-7 09:42

没用过okhttp,但是大概查了一下,okhttp发送请求时是新开一个线程去请求的,你访问的那个url,不知道是什么原因,可能是网络不通畅或者其他原因,卡住了,所以导致线程没有关闭,一直在请求中,所以导致你运行到最后一句,main也没有结束,因为还有线程存活,你设置个timeout。

vvvwxf 发表于 2023-6-7 09:52

你没有设置超时时间吧,okhttp是另外一个线程去访问的,你的main方法没有结束因为http请求还在。
##################### httpUtils properties #####################
ok.http.connect-timeout=60
ok.http.keep-alive-duration=300
ok.http.max-idle-connections=200
ok.http.read-timeout=60
ok.http.write-timeout=60


这是我现在的配置你可以根据你的需求做一下调整

Vvvvvoid 发表于 2023-6-7 10:01

不是 BUG , client 有自己的连接池, 并且池子里的线程是守护线程.
需要手动关闭 , 才会结束进程

client.connectionPool().evictAll();
client.dispatcher().executorService().shutdown();
页: [1] 2
查看完整版本: 这是okhttp的bug吗?(已解决)