java无响应_Java HttpClient请求无响应解决方案
首先来看下多线程处理的流程:
在来看下: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请求无响应解决方案相关推荐
- java getreader_java后台发起get请求获取响应数据学习记录: 话不多说直接上代码
: package com.jl.chromeTest; import java.io.BufferedReader; import java.io.InputStreamReader; import ...
- Java Web(day05) —— 请求和响应
一.Java web之请求和响应 Servlet最主要作用就是处理客户端请求并作出回应,为此,针对每次请求,Web容器在调用service()之前都会创建两个对象,分别是HttpServletRequ ...
- java int转无符号_Java 中使用无符号整型(unsigned int)的使用方法
背景 计算机科班出身大多学过离散数学,或者理工类专业也大多学习过 C 或 C++ 语言,从中我们了解到基本类型的整形有 short.int.long 等,还分别有无符号(unsigned)和带符号(s ...
- CEF3:拦截http request请求和response响应(包括ajax请求和响应也能拦截到)
文章目录 前言 思路 代码 前言 笔者在项目开发中有需求,需要拦截 js中 发起的 http 请求和响应数据 写到文件中,方便给开发人员或者测试人员查看.笔者拿到这个需求第一反应是,cef肯定有这种接 ...
- java jframe 卡死_java - JFrame的无响应KeyListener
java - JFrame的无响应KeyListener 我正在尝试为我的KeyListener实现JFrame.在构造函数上,我正在使用此代码: System.out.println("t ...
- java 接口超时控制_Java接口请求响应超时的解决办法
最近在做报表需求的时候,遇到一个问题: 前台给个请求,由于后台执行逻辑需要很长时间,因此导致页面响应超时. 在网上查询相关资料,找到了几种解决方案: 通过修改配置文件,延长响应时间: rest.Rea ...
- java中断响应时间_Java多线程 sleep方法响应中断 sleep面试问题(与wait/notify的
Java多线程 sleep方法响应中断 sleep面试问题(与wait/notify的 Java多线程 sleep方法响应中断 & sleep面试问题(与wait/notify的比较) 文章目 ...
- java无参_Java——类的无参、带参方法
>类的无参方法 什么是类的方法 类是由一组具有相同属性和共同行为的实体抽象而来.对象执行的操作是通过编写类的方法实现的.显而易见,类的方法是一个功能模块,其作用是"做一件事情" ...
- java 调用远程服务_java调用(请求)远程服务地址
/** * 前端Ajax获取管理相对人经纬度信息 * @author jiyanle * @date 2014-10-31 */ public String getPosition() { HttpS ...
最新文章
- 泥浆配制_朝政泥浆——广西田阳县百东河水库溢洪道穿越钻泥浆配制简述(3)...
- 算法复杂度速查表 | 必备神器
- -javaagent:_从javaagent迁移到JVMTI:我们的经验
- php 获取字符串中的url,php使用正则表达式获取字符串中的URL
- linux如何判断网线插入_“Linux”中如何判断哪个网卡连接网线?
- 在react中使用定时器
- tensorflow,Anaconda和 vscode 如何连接以及问题解决
- qt qlabel 布局重叠_Pyqt5布局管理实例
- CF1041D Glider
- 符合c语言语法规定的表达式,若变量定义为int fahr;,则5(fahr-32)/9是符合C语言语法的表达式...
- 【浅墨著作】《逐梦旅程:Windows游戏编程之从零开始》勘误配套源代码下载
- C语言必背代码大全(2021整理)
- Excel-几行几行进行转置
- 谷歌广告联盟怎么收款?google AdSense 广告款收取流程!(转载)
- Mac修改登陆界面背景图片,开机登陆界面,替换沙漠背景图 @macOS Mojave - 10.14.x
- 黑猴子的家:JavaWeb 之 CSS
- 2019版云计算大数据学习路线图(含大纲+视频+工具+书籍+面试)
- 国内TeamViewer正版授权的代理商有哪些?如何查询?
- 在MySQL命令行下如果输错了命令怎么办?
- 2019届小米秋招笔试题第一题_厨艺大赛奖金