1

私の Web アプリケーションには、アプリケーションの多くの部分で使用されるグローバルな静的 HttpClient があります。次のように作成されます。

MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams params = new HttpConnectionManagerParams();
params.setConnectionTimeout( 15000 );
params.setSoTimeout( 15000 );
connectionManager.setParams(params);
httpclient = new HttpClient(connectionManager);
HttpClientParams clientParams = new HttpClientParams();
clientParams.setParameter("http.protocol.allow-circular-redirects", true);
clientParams.setParameter("http.protocol.max-redirects", 4);
httpclient.setParams(clientParams);

タイムアウトはほとんどのユースケースで問題ありませんが、特定の呼び出しではタイムアウトを短くしたいと思います。ので、私は持っています:

GetMethod get = new GetMethod(finalUrl);

get.getParams().setParameter("http.socket.timeout", new Integer(1000));
get.getParams().setParameter("http.connection.timeout", new Integer(1000));
HttpClientUtil.getShortTimeoutInstance().executeMethod(get);

それは動作しません。接続タイムアウトはまだ 15000 です。新しい HttpClient インスタンスを作成せずに GetMethod で特定の接続タイムアウトを設定できますか (これは、新しい HttpClient インスタンスを作成するのは得策ではないと考えているためです)。

4

1 に答える 1

0

あなたは見たいかもしれません

./impl/conn/tsccm/ThreadSafeClientConnManager.java

方法

ClientConnectionRequest requestConnection(final HttpRoute route, 
                                          final Object state)

ルートの接続プールが初期化されると、拡張/オーバーライドしない限り、ソケット timeOut の最初に構成された値が引き続き使用されます。

public ClientConnectionRequest requestConnection(
        final HttpRoute route,
        final Object state) {

    final PoolEntryRequest poolRequest = pool.requestPoolEntry(
            route, state);

    return new ClientConnectionRequest() {

        public void abortRequest() {
            poolRequest.abortRequest();
        }

        public ManagedClientConnection getConnection(
                long timeout, TimeUnit tunit) throws InterruptedException,
                ConnectionPoolTimeoutException {
            if (route == null) {
                throw new IllegalArgumentException("Route may not be null.");
            }

            if (log.isDebugEnabled()) {
                log.debug("Get connection: " + route + ", timeout = " + timeout);
            }

            BasicPoolEntry entry = poolRequest.getPoolEntry(timeout, tunit);
            return new BasicPooledConnAdapter(ThreadSafeClientConnManager.this, entry);
        }

    };

}
于 2012-04-14T15:55:43.690 に答える