从HttpClient中的ProtocolException中恢复

时间:2013-08-12 16:54:40

标签: java httpclient

从HttpClient下载时,我有时会得到这样的堆栈跟踪:

java.net.SocketTimeoutException: Read timed out, at java.net.SocketInputStream.socketRead0(Native Method), 
...
at org.apache.commons.httpclient.ContentLengthInputStream.read(ContentLengthInputStream.java:170), 
[wrapped] 
org.apache.commons.httpclient.ProtocolException: The server example.com failed to respond with a valid HTTP response, 

我试图通过使用自定义HttpMethodRetryHandler来从这些错误中恢复,但似乎我甚至没有输入retryMethod()。这可能是由于SocketTimeoutException中的包装异常是一个ProtocolException,它继承自HttpException,因此如果我正确理解了HttpMethodDirector类的代码,则无法恢复。

 while (true) {
       execCount++;
       try {
           ...
       } catch (HttpException e) {
           // filter out protocol exceptions which cannot be recovered from
           throw e;
       } catch (IOException e) {
           // test if this method should be retried

http://hc.apache.org/httpclient-3.x/exception-handling.html

  

ProtocolException表示违反了HTTP规范。它是   重要的是要注意HTTP代理和HTTP服务器可以有   不同级别的HTTP规范合规性。这可能是可能的   通过配置从一些HTTP协议异常中恢复   HttpClient对非致命协议违规更为宽容。

我怎样才能实现这一目标?是否存在允许此操作的API,还是应该实现mecanism以重试因HttpException而失败的请求?

1 个答案:

答案 0 :(得分:0)

有许多http.protocol.*配置参数已定义here。你需要仔细查看它们中的每一个,并找出你需要的最佳宽容度。