2011-05-16 23 views

cevap

75

(aga içinde). yeni bir yol gibi görünür:

yılında
RequestConfig.Builder requestBuilder = RequestConfig.custom(); 
requestBuilder = requestBuilder.setConnectTimeout(timeout); 
requestBuilder = requestBuilder.setConnectionRequestTimeout(timeout); 

HttpClientBuilder builder = HttpClientBuilder.create();  
builder.setDefaultRequestConfig(requestBuilder.build()); 
HttpClient client = builder.build(); 
+6

'requestBuilder.setSocketTimeout (zaman aşımı) 'nı da eklemeniz gerekir. Lütfen "zaman aşımı" nın milisaniye olduğunu unutmayın! – Stefan

+2

"setConnectTimeout()" ve ['setConnectionRequestTimeout()'] işlevlerinin (http://stackoverflow.com/questions/20271017/connection-and-connection-request-timeout#comment30255182_20271424) aranmasının ** aynı değil olduğunu unutmayın. "CONNECTION_TIMEOUT" ve "SO_TIMEOUT" ayarlarının yapılması (sorudaki gibi). Muhtemelen setConnectTimeout() ve setSocketTimeout() 'ı istersiniz. – Jonik

+4

Ayrıca, Builder çok daha basit bir kod için bu ifadeleri zincirleme sağlar: 'RequestConfig config = RequestConfig.custom(). SetConnectTimeout (zaman aşımı) .setSocketTimeout (zaman aşımı) .build();' – Jonik

4

section 2.5'da CONNECTION_TIMEOUT parametresi nasıl ayarlanacağına dair bir örnek görürsünüz.

CONNECTION_TIMEOUT, ilk bağlantı için bekleyen süredir ve SO_TIMEOUT, bağlantı kurulduktan sonra bir paket okurken beklediğiniz zaman aşımıdır.

8

@jontro yanıtı doğrudur, ancak bunun nasıl yapılacağı konusunda bir kod parçacığının olması her zaman iyidir. Bu parametrelerin her biri için 10 saniyelik bir zaman aşımı ayarlayın:

Versiyon 1:

HttpClient httpclient = new DefaultHttpClient(); 
// this one causes a timeout if a connection is established but there is 
// no response within 10 seconds 
httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10 * 1000); 

// this one causes a timeout if no connection is established within 10 seconds 
httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10 * 1000); 

// now do the execute: 
HttpGet httpget = new HttpGet(URL); 
HttpResponse response = httpclient.execute(httpget); 



Versiyon 2: Ayrıca 10 saniyelik zaman aşımı için ayarlanmış Bunu yapmanın iki yolu vardır bu parametrelerin her biri: yapılandırma refactored edildi Apache HTTP Client sürümü 4.3 olarak

HttpParams params = new BasicHttpParams(); 
HttpConnectionParams.setConnectionTimeout(params, 10 * 1000); 
HttpConnectionParams.setSoTimeout(params, 10 * 1000); 

HttpClient httpclient = new DefaultHttpClient(params); 
HttpGet httpget = new HttpGet(URL); 
HttpResponse response = httpclient.execute(httpget); 
+0

statik yöntemleri Ayrıca bkz HttpConnectionParams.setConnectionTimeout() ve HttpConnectionParams.setSoTimeout() aynı şeyi gerçekleştirmek için biraz daha uygun bir şekilde sağlayan. – dnault

+0

Teşekkürler. Cevabı bu seçenekle güncelledim. – quux00

+0

Son derece yardımsever. Çok teşekkürler!!! –

7

HttpClient sen .. tüm istek java.net.SocketInputStream.socketRead0 geçici olarak çözmek için Ben sert zaman aşımını ayarlamak 5 saniye

int timeout = 5; 
RequestConfig config = RequestConfig.custom() 
    .setConnectTimeout(timeout * 1000) 
    .setConnectionRequestTimeout(timeout * 1000) 
    .setSocketTimeout(timeout * 1000).build(); 
CloseableHttpClient client = 
    HttpClientBuilder.create().setDefaultRequestConfig(config).build(); 
HttpGet request = new HttpGet("http://localhost:8080/service"); // GET Request 
response = client.execute(request); 
1

için diyelim örneğin aşağıda kullanabilirsiniz 4.3 sürümü sorun.

private static final ScheduledExecutorService SCHEDULED_EXECUTOR = Executors.newSingleThreadScheduledExecutor() 

HttpGet request = new HttpGet("http://www.example.com") 
final Runnable delayedTask = new Runnable() { 
    @Override 
    public void run() { 
     request.abort() 
    } 
} 
SCHEDULED_EXECUTOR.schedule(delayedTask, 100000, TimeUnit.MILLISECONDS)