soTimeoutが設定されていてもApacheのhttpclientがsocketreadをブロックする

私はワイヤでいくつかのhtmlページを取得しなければならず、http-componentsパッケージからapacheのhttpclientを使用しています。 connectionTimeout、soTimeoutを5000ミリ秒として設定し、リダイレクトをfalseにしましたが、コードはsocketread関数でブロックされているようです。

The specific url's which are blocked are given below: http://high.lrn.fm http://gotradioaac04.lbdns-streamguys.com

誰も私にどのようにスレッドがソケットの読み取り操作でブロックするのを防ぐ方法についてのアドバイスを与えることができますhttpclient

私のコードは、参照用に以下に与えられています

public class HTTPDataDownloader {

    private static final Logger logger          = Logger.getLogger(HTTPDataDownloader.class);
    private int                 soTimeout;                                                     //ms
    private int                 connTimeout;                                                   //ms
    private HttpParams          httpParameters;
    private HttpClient          httpClient;
    private static final String HTTP_CONTENT    = "text/html";

    public HTTPDataDownloader( int soTimeout, int connTimeout ) {
        this.soTimeout = soTimeout;
        this.connTimeout = connTimeout;
        initialize();
    }

    private void initialize() {
        httpParameters = new BasicHttpParams();
       //Set the timeout in milliseconds until a connection is established.
        HttpConnectionParams.setConnectionTimeout(httpParameters, connTimeout);
       //Set the default socket timeout (SO_TIMEOUT)
       //in milliseconds which is the timeout for waiting for data.
        HttpConnectionParams.setSoTimeout(httpParameters, soTimeout);
        HttpConnectionParams.setStaleCheckingEnabled(httpParameters, false);
        HttpConnectionParams.setLinger(httpParameters, 5);
        httpParameters.setParameter("http.protocol.handle-redirects",false);
        HttpClientParams.setRedirecting(httpParameters, false);
        //HttpClientParams.setConnectionManagerTimeout(httpParameters, 500);

        httpClient = new DefaultHttpClient(httpParameters);
        httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    }

    private void setRetryHandler() {
        HttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(2, true);

        //httpClient.setHttpRequestRetryHandler(retryHandler);
        //httpClient.getParams().setParameter(HttpParams, arg1)
    }

   //takes the url, make the connection and fetch the data
    public String fetch( String urlname ) {
        urlname = formatURL(urlname);
        HttpGet httpget = new HttpGet();
        try {
            httpget.setURI(new URI(urlname));
        } catch ( URISyntaxException e ) {
            logger.error(e.toString());
            return null;
        }

        StringBuilder content = new StringBuilder();
        InputStream instream = null;
        try {
            HttpResponse httpResponse = httpClient.execute(httpget);
            HttpEntity entity = httpResponse.getEntity();
            if ( entity != null ) {

                String contentType = entity.getContentType().getValue();
                HeaderElementIterator it = new BasicHeaderElementIterator(
                                                                          httpResponse.headerIterator(HTTP.CONN_KEEP_ALIVE));
            /*  while (it.hasNext()) {
                    HeaderElement he = it.nextElement();
                    String param = he.getName(); 
                    String value = he.getValue();
                    if (value != null && param.equalsIgnoreCase("timeout")) {
                        System.out.println(value + urlname);
                    }
                }*/
                if ( contentType != null && contentType.indexOf(HTTP_CONTENT) >= 0 ) {
                    instream = entity.getContent();
                    BufferedReader br = new BufferedReader(new InputStreamReader(instream));
                    String line;
                    String newLine = System.getProperty("line.separator");

                    while ( (line = br.readLine()) != null )
                        content.append(line + newLine);
                    logger.info("Downloaded: " + httpget.getURI().toString());
                    return content.toString();
                }
            }
        }
        catch ( ClientProtocolException e ) {       
            logger.info("ClientProtocolException: " + e + " " + urlname);
        } catch ( ConnectTimeoutException e ) {
            logger.info("ConnectionTimeoutException: " + e + " " + urlname);
        } catch ( SocketTimeoutException e ) {
            logger.info("SocketTimeoutException: " + e + " " + urlname);
        } catch ( IOException e ) {
            logger.info("IOException: " + e + " " + urlname);
        } catch ( Exception e ) {
            logger.equals("Exception: " + e + " " + urlname);
        } finally {
            httpget.abort();    
            try {               
                if (instream != null)
                    instream.close(); 
            } catch ( IOException e ) { }
        }

        return null;
    }
1
はい、私はそれをチェックしました...それは、URLが移動してリダイレクトする必要があることを意味します...しかし、私はリダイレクションをオフにしました。これは処理すべきだと思います...しかし、他のURLは何か問題を引き起こしています
追加された 著者 Amm Sokun,
あなたはこれに対する解決策または回避策を見つけることができましたか?私はまったく同じ問題を抱えています。 Shoutcast URLから取得しようとすると発生します。
追加された 著者 csvan,
最初のURLはHTTP 302(Moved Permanently)を返しています。これは関連性がありますか?
追加された 著者 Gian,
"コードがソケット読み込み機能でブロックされているようです"。あなたの証拠は何ですか?
追加された 著者 EJP,

1 答え

私は、httpclient.executeスレッドが接続を解放しないため、この問題も解決しました。応答を得た後、2行追加することができます:

httpget.releaseConnection();
httpclient.getConnectionManager().shutdown();
0
追加された