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