欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Http请求长时间等待无结果返回解决办法

程序员文章站 2023-11-27 14:02:34
http请求长时间等待无结果返回解决办法 今天遇到一个奇葩的问题,这个程序主要是用于调用接口搜集数据的,但是,发生了不好的事情就是服务器中启动的进程非常多,一直无法结束,...

http请求长时间等待无结果返回解决办法

今天遇到一个奇葩的问题,这个程序主要是用于调用接口搜集数据的,但是,发生了不好的事情就是服务器中启动的进程非常多,一直无法结束,没办法只能采用kill的方法,将所有的这部分进程杀掉。

分析了下程序,写了个测试,本地跑依旧长时间等待,无法运行,也不抛出异常,最后发现问题在于发送请求的部分,一直在等待对方服务器响应,由于采用的是keep-alive方式的连接,这里没有采用超时的方式,以至于程序会长时间等待下去。

经过测试发现开启进程过多在于没有设置超时,希望读者注意这部分,否则,容易出现笔者遇到的这种问题。最终的问题应该是接口提供方的异常导致。

public static string sendpost(string url, string param) {
      printwriter out = null;
      bufferedreader in = null;
      string result = "";
      try {
        url realurl = new url(url);
        // 打开和url之间的连接
        urlconnection conn = realurl.openconnection();
        // 设置通用的请求属性
        conn.setrequestproperty("accept", "*/*");
        conn.setrequestproperty("connection", "keep-alive");
        conn.setrequestproperty("user-agent",
            "mozilla/4.0 (compatible; msie 6.0; windows nt 5.1;sv1)");
        conn.setconnecttimeout(4000);
        conn.setreadtimeout(4000);
        // 发送post请求必须设置如下两行
        conn.setdooutput(true);
        conn.setdoinput(true);
        // 获取urlconnection对象对应的输出流
        out = new printwriter(conn.getoutputstream());
        // 发送请求参数
        out.print(param);
        // flush输出流的缓冲
        out.flush();
        // 定义bufferedreader输入流来读取url的响应
        in = new bufferedreader(
            new inputstreamreader(conn.getinputstream()));
        string line;
        while ((line = in.readline()) != null) {
          result += line;
        }
      } catch (exception e) {
        system.out.println("发送 post 请求出现异常!");
        //e.printstacktrace();
      }
      //使用finally块来关闭输出流、输入流
      finally{
        try{
          if(out!=null){
            out.close();
          }
          if(in!=null){
            in.close();
          }
        }
        catch(ioexception ex){
          //ex.printstacktrace();
        }
      }
      return result;
    }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!