Java  HttpURLConnection超时和IO异常处理

最近同步数据的时候发现了一个问题,我本身后台插入数据后给其他部门后台做同步。说简单一点其实就是调用对方提供的接口,进行HTTP请求调用。然后后面发现问题了。HTTP请求的话,有可能请求超时,中断失败,IO异常其实都有可能,如果是平时打开一个网页还好,打不开的时候,你会关掉,或者他页面给你显示信息。但是同步,不可以这样做,一旦请求失败,必须让数据正确的同步,今天才意识到这个问题的重要性。

String httpUrl = "https://www.baidu.com/s?ie=UTF-8&tn=90594569_hao_pg&wd=1";
URL url = null;
HttpURLConnection httpConn = null;
String result = "";
try {
  String address = httpUrl;
  url = new URL(address);
  httpConn = (HttpURLConnection) url.openConnection(); 

  //A URL connection can be used for input and/or output. Set the
  //DoInput flag to true if you intend to use the URL connection for input,
  //false if not. The default is true.  

  //URL连接可用于input或output。如果想用URL连接输入,设置DoInput标签为true。
  //输入和输出是针对计算机的,如果以程序员的角度考虑,经常弄混。
  //input输入,output输出,那么不是从output里read,input中write吗,其实相反
  //input输入进计算机,计算机才能读,所以是从input read,而output是计算机输出,通过output write。
  httpConn.setDoOutput(false);
  //所以如果setDoInput(false),想从URLConnection读取时不能读取
  //Cannot read from URLConnection if doInput=false (call setDoInput(true))
  httpConn.setDoInput(true); 

  //连接建立超时时间还有读取数据超时时间,
  httpConn.setConnectTimeout(600000);
  httpConn.setReadTimeout(600000);
  httpConn.setRequestMethod("GET");
  httpConn.connect(); 

  //获取状态码
  int code = httpConn.getResponseCode();
  System.out.println(code);
  //读http请求响应
  BufferedReader reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));
  String line;
  while ((line = reader.readLine()) != null)
  {
    result = result + line+"\n";
  }
  System.out.println(result);
  //关闭IO和连接
  reader.close();
  httpConn.disconnect();
}
catch(Exception e){
  log.error(e);
}
finally{
  if(httpConn!=null)
    httpConn.disconnect();
}

代码看上去写的没什么,该释放资源的地方也释放了。该打日志输出的也打了。其实问题就是异常的处理。之前以为一些东西没有同步过去是因为连接超时的问题。所以特地捕获SocketTimeoutException异常,后面看了日志之后,发现是同步接口那边服务器的问题,报了502错误。其实异常是IO异常。

无论是那种情况,我们都要在出现这种问题之后,再次地把请求发送过去,根据接口返回的结果,确认对方已经同步到。如果服务器暂时性的出了问题,我们可以暂停一小段时间后,然后再次请求。

所以暂时想到的方法是,由于同步的实时性要求不高,那么可以间隔的时间可以长一点。然后循环,另起线程,每次间隔5分钟,直至结果正常。

catch(Exception e){
  for (int i = 0; i < 6; i++) {
    Thread t = new Thread(){public void run(){get();}};
    t.start();
    if(result.equals("ok")){
      break;
    }
    try {
      Thread.sleep(300000);
    } catch (InterruptedException e2) {
      log.error(e2);
    }
  }
  log.error(e);
}

以上就是对Java  HttpURLConnection超时和IO异常处理的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

(0)

相关推荐

  • Java异常类型以及处理实例详解

    目录 一.异常的描述 二.异常的体系 三.异常的分类: 四.异常处理的捕捉形式 五.异常处理的原则 六.finally 七.异常的应用 八.异常的注意事项: 总结 一.异常的描述 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止.在Java中即,Java在编译或运行或者运行过程中出现的错误. Java提供了更加优秀的解决办法:异常处理机制. 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处

  • java异常处理机制示例(java抛出异常、捕获、断言)

    这是一个介绍基本异常处理的小例子,包括抛出,捕获,断言,日志. Java异常处理通过5个关键字try.catch.throw.throws.finally进行管理.基本过程是用try语句块包住要监视的语句,如果在try语句块内出现异常,则异常会被抛出,你的代码在catch语句块中可以捕获到这个异常并做处理;还有以部分系统生成的异常在Java运行时自动抛出.你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象. 复制代码 代码如下: package

  • Java异常分类及统一处理详解

    一.异常分类 java异常分为"检查"和"非检查"两类,"检查"二字的意思是,代码编译时,编译器会去Check一下有没有进行异常处理(捕获或向上抛),对于归类为需要检查的异常,若没处理,编译就过不去.        初学的时候,常常想为啥异常要这样分类处理? 后来明白了些,异常不过两种:主观和客观,一个大多数情况下可以避免,一个大多数情况下无法避免.        像NullPointerException这类异常,大多跟程序员素质挂钩(开发好,

  • 详解Java异常处理中throw与throws关键字的用法区别

    抛出异常 抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常.下面它们之间的异同. 系统自动抛异常 当程序语句出现一些逻辑错误.主义错误或类型转换错误时,系统会自动抛出异常.如: public static void main(String[] args) { int a = 5, b =0; System.out.println(5/b); //function(); } 系统会自动抛出ArithmeticException异常: Exception in threa

  • Java中异常处理之try和catch代码块的使用

    Java try和catch的使用 尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自己处理异常.这样做有两个好处.第一,它允许你修正错误.第二,它防止程序自动终止.大多数用户对于在程序终止运行和在无论何时错误发生都会打印堆栈轨迹感到很烦恼(至少可以这么说).幸运的是,这很容易避免. 为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了.紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句.完成这个任务很简单,下面的程序包含一个

  • Java程序常见异常及处理汇总

    一.JDK中常见的异常情况 1.常见异常总结图 2.java中异常分类 Throwable类有两个直接子类: (1)Exception:出现的问题是可以被捕获的 (2)Error:系统错误,通常由JVM处理 3.被捕获的异常分类 (1)Check异常: 派生自Exception的异常类,必须被捕获或再次声明抛出 (2)Runtime异常:派生自RuntimeException的异常类.使用throw语句可以随时抛出这种异常对象 throw new ArithmeticException(-);

  • java进行error捕获和处理示例(java异常捕获)

    下面给个小例子,来验证一下error的捕获. 复制代码 代码如下: public class TestCatchError extends Error{ private static final long serialVersionUID = -351488225420878020L; public TestCatchError(){        super();    } public TestCatchError(String msg){        super(msg);    } p

  • 深入探讨JAVA中的异常与错误处理

    异常与错误: 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员)已经犯了个错误,现在有一个机会来修改它.Java中使用异常类来表示异常,不同的异常类代表了不同的异常.但是在Java中所有的异常都有一个基类,叫做Exception. 错误: 它指的是一个合理的应用程序不能截获的严重的问题.大多数都是反常的情况.错误是VM的一个故障(虽然它可以是任何系统级的服务).

  • java异常与错误处理基本知识

    异常与错误:异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员)已经犯了个错误,现在有一个机会来修改它.Java中使用异常类来表示异常,不同的异常类代表了不同的异常.但是在Java中所有的异常都有一个基类,叫做Exception.错误:它指的是一个合理的应用程序不能截获的严重的问题.大多数都是反常的情况.错误是VM的一个故障(虽然它可以是任何系统级的服务).所以,

  • java中的connection reset 异常处理分析

    在Java中常看见的几个connection rest exception, Broken pipe, Connection reset,Connection reset by peer Socked reset case Linux中会有2个常见的sock reset 情况下的错误代码 ECONNRESET 该错误被描述为"connection reset by peer",即"对方复位连接",这种情况一般发生在服务进程较客户进程提前终止.当服务进程终止时会向客户

随机推荐