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() に入っていないようです。HttpMethodDirector クラスのコードを正しく理解していれば、SocketTimeoutException でラップされた例外が HttpException を継承する ProtocolException であるため、回復の対象にならないことが原因である可能性があります。

 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