2

从 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 规范合规性。通过将 HttpClient 配置为对非致命协议违规更为宽松,可以从某些 HTTP 协议异常中恢复。

我怎样才能做到这一点?是否有允许此操作的 API,或者我应该实施该机制以重试因 HttpException 失败的请求?

4

1 回答 1

0

此处http.protocol.*定义了许多配置参数。您需要仔细查看其中的每一个,并找出您需要的最佳宽大处理。

于 2013-08-12T17:19:07.373 回答