首先来看下多线程处理的流程:

在来看下:httpClient请求工具方法:

public static String sendGetRequest(String reqURL, String decodeCharset) throws IOException {

long responseLength = 0; // 响应长度

String responseContent = null; // 响应内容

HttpClient httpClient = new DefaultHttpClient(); // 创建默认的httpClient实例

HttpGet httpGet = new HttpGet(reqURL); // 创建org.apache.http.client.methods.HttpGet

try {

HttpResponse response = httpClient.execute(httpGet); // 执行GET请求

HttpEntity entity = response.getEntity(); // 获取响应实体

if (null != entity) {

responseLength = entity.getContentLength();

responseContent = EntityUtils.toString(entity,

decodeCharset == null ? "UTF-8" : decodeCharset);

EntityUtils.consume(entity); // Consume response content

}

logger.debug("请求地址: " + httpGet.getURI());

logger.debug("响应状态: " + response.getStatusLine());

logger.debug("响应长度: " + responseLength);

logger.debug("响应内容: " + responseContent);

if(response.getStatusLine().getStatusCode() != 200) {

throw new RuntimeException("HTTP请求响应码为:"+response.getStatusLine().getStatusCode());

}

} catch (ClientProtocolException e) {

logger.debug("该异常通常是协议错误导致,比如构造HttpGet对象时传入的协议不对(将'http'写成'htp')或者服务器端返回的内容不符合HTTP协议要求等,堆栈信息如下"

+ e);

throw e;

} catch (ParseException e) {

logger.debug(e.getMessage() + e);

throw e;

} catch (IOException e) {

logger.debug("该异常通常是网络原因引起的,如HTTP服务器未启动等,堆栈信息如下" + e);

throw e;

} finally {

httpClient.getConnectionManager().shutdown(); // 关闭连接,释放资源

}

return responseContent;

我们来个测试方法,请求一个请求不通的地址看看:

public static void main(String[] args) {

long startTime=System.currentTimeMillis();

try{

System.out.println("开始时间:"+startTime);

String url="http://10.128.89.2:8080/test";

sendGetRequest(url, "utf-8");

long endTime=System.currentTimeMillis();

System.out.println("结束时间:"+endTime);

System.out.println("耗时:"+(endTime-startTime)/1000);

}catch(Exception e){

e.printStackTrace();

long endTime=System.currentTimeMillis();

System.out.println("结束时间:"+endTime);

System.out.println("耗时:"+(endTime-startTime)/1000);

}

}

运行结果如下:

从这个我们知道,HttpClient链接超时的默认时间是21S。

那么我上面的代码也没有写响应超时,那响应超时默认时间是多少呢?

我们来个接口,在接口里面线程休眠1000000000毫秒

@Controller

@RequestMapping(value = "/test")

public class TestController extends BaseController {

@RequestMapping(value = "/check", method = RequestMethod.GET)

public void check(HttpServletRequest request, HttpServletResponse response) {

try{

Thread.sleep(1000000000);

}catch(Exception e){

e.printStackTrace();

}

}

}

如果现在运行测试方法,因为该接口需要很长时间后才会响应。那么HttpClient请求方是一直在等待着响应,从而证实了一点,HttpClient默认无响应超时。

这种现象如果在多线程环境中,那么就是致命的。因为主线程在等待子线程处理完成,而子线程一直在等待Http响应。在复杂的网络环境中,可能会由于某种原因,永远都不会有响应,那么线程永远的等待。所以我们会以为,怎么线程死了。

所以在用HttpClient时候,最好设置个响应超时。

(本文由:阿中提供,版权所有,盗版必究,联系QQ:568017880,后续)

java无响应_Java HttpClient请求无响应解决方案相关推荐

  1. java getreader_java后台发起get请求获取响应数据学习记录: 话不多说直接上代码

    : package com.jl.chromeTest; import java.io.BufferedReader; import java.io.InputStreamReader; import ...

  2. Java Web(day05) —— 请求和响应

    一.Java web之请求和响应 Servlet最主要作用就是处理客户端请求并作出回应,为此,针对每次请求,Web容器在调用service()之前都会创建两个对象,分别是HttpServletRequ ...

  3. java int转无符号_Java 中使用无符号整型(unsigned int)的使用方法

    背景 计算机科班出身大多学过离散数学,或者理工类专业也大多学习过 C 或 C++ 语言,从中我们了解到基本类型的整形有 short.int.long 等,还分别有无符号(unsigned)和带符号(s ...

  4. CEF3:拦截http request请求和response响应(包括ajax请求和响应也能拦截到)

    文章目录 前言 思路 代码 前言 笔者在项目开发中有需求,需要拦截 js中 发起的 http 请求和响应数据 写到文件中,方便给开发人员或者测试人员查看.笔者拿到这个需求第一反应是,cef肯定有这种接 ...

  5. java jframe 卡死_java - JFrame的无响应KeyListener

    java - JFrame的无响应KeyListener 我正在尝试为我的KeyListener实现JFrame.在构造函数上,我正在使用此代码: System.out.println("t ...

  6. java 接口超时控制_Java接口请求响应超时的解决办法

    最近在做报表需求的时候,遇到一个问题: 前台给个请求,由于后台执行逻辑需要很长时间,因此导致页面响应超时. 在网上查询相关资料,找到了几种解决方案: 通过修改配置文件,延长响应时间: rest.Rea ...

  7. java中断响应时间_Java多线程 sleep方法响应中断 sleep面试问题(与wait/notify的

    Java多线程 sleep方法响应中断 sleep面试问题(与wait/notify的 Java多线程 sleep方法响应中断 & sleep面试问题(与wait/notify的比较) 文章目 ...

  8. java无参_Java——类的无参、带参方法

    >类的无参方法 什么是类的方法 类是由一组具有相同属性和共同行为的实体抽象而来.对象执行的操作是通过编写类的方法实现的.显而易见,类的方法是一个功能模块,其作用是"做一件事情" ...

  9. java 调用远程服务_java调用(请求)远程服务地址

    /** * 前端Ajax获取管理相对人经纬度信息 * @author jiyanle * @date 2014-10-31 */ public String getPosition() { HttpS ...

最新文章

  1. 泥浆配制_朝政泥浆——广西田阳县百东河水库溢洪道穿越钻泥浆配制简述(3)...
  2. 算法复杂度速查表 | 必备神器
  3. -javaagent:_从javaagent迁移到JVMTI:我们的经验
  4. php 获取字符串中的url,php使用正则表达式获取字符串中的URL
  5. linux如何判断网线插入_“Linux”中如何判断哪个网卡连接网线?
  6. 在react中使用定时器
  7. tensorflow,Anaconda和 vscode 如何连接以及问题解决
  8. qt qlabel 布局重叠_Pyqt5布局管理实例
  9. CF1041D Glider
  10. 符合c语言语法规定的表达式,若变量定义为int fahr;,则5(fahr-32)/9是符合C语言语法的表达式...
  11. 【浅墨著作】《逐梦旅程:Windows游戏编程之从零开始》勘误配套源代码下载
  12. C语言必背代码大全(2021整理)
  13. Excel-几行几行进行转置
  14. 谷歌广告联盟怎么收款?google AdSense 广告款收取流程!(转载)
  15. Mac修改登陆界面背景图片,开机登陆界面,替换沙漠背景图 @macOS Mojave - 10.14.x
  16. 黑猴子的家:JavaWeb 之 CSS
  17. 2019版云计算大数据学习路线图(含大纲+视频+工具+书籍+面试)
  18. 国内TeamViewer正版授权的代理商有哪些?如何查询?
  19. 在MySQL命令行下如果输错了命令怎么办?
  20. 2019届小米秋招笔试题第一题_厨艺大赛奖金

热门文章

  1. 《朗读者》读后感作文3100字
  2. 用AR.js做图片追踪的webAR Demo
  3. C中的struct,union,Bit Filed以及内存对齐
  4. 2023计算机考研408参考答案
  5. 局部(x,y)坐标 转 WGS84经纬度坐标
  6. 如何写PRD文档[最全版]
  7. pandas parquet文件读取pyarrow、feather文件保存与读取;requests 或wget下载图片文件
  8. airtest获取手机分辨率,通过相对坐标定位元素
  9. 角度转换之度分秒的转换成度
  10. STM32H7 USART 时钟初始化