从 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 失败的请求?