2016-07-04 3 views
3

Après mon codeImpossible de définir Socket Timeout moins de 1000 millisecondes dans RequestConfig (Apache HTTP client async 4.1.2)

 RequestConfig requestConfig = RequestConfig.custom() 
       .setSocketTimeout(100) 
       .setConnectTimeout(100) 
       .setConnectionRequestTimeout(100).build(); 


     CloseableHttpAsyncClient httpClient = HttpAsyncClients.custom() 
       .setDefaultRequestConfig(requestConfig) 
       .build(); 

     httpClient.start(); 

Selon la valeur setSocketTimeout, il devrait délai d'attente en 100 ms, mais il prend 1000 ms à l'expiration Cependant, setSocketTimeout honore toutes les valeurs supérieures à 1000 ms.

+0

100ms est beaucoup trop court pour un timeout de lecture ou un timeout de connexion. – EJP

+0

@EJP 1000 ms semble être la valeur minimale autorisée pour socket timeout. Toute valeur inférieure à 1000 ms est définie sur 1000. –

+0

Par ce cadre. Pas par Java. – EJP

Répondre

4

Ce comportement est intentionnel. Les threads de sélecteur d'E/S doivent régulièrement parcourir les sessions d'E/S existantes et déclencher un événement de délai d'attente de socket en cas d'inactivité d'E/S. Cette opération peut devenir très coûteuse, surtout à mesure que le nombre de sessions simultanées augmente. Par défaut, l'intervalle de sélection d'entrée/sortie est défini sur 1 000 ms et, par conséquent, la granularité du délai d'attente de socket est de 1 seconde. On peut réduire l'intervalle de sélection et faire en sorte que les threads de sélection d'E/S parcourent plus souvent les sessions au prix d'une plus grande utilisation de l'UC. Avec un intervalle de sélection de 1 ms, les threads de sélection d'E/S fonctionneront effectivement dans une boucle occupée.

IOReactorConfig ioReactorConfig = IOReactorConfig.custom() 
     .setSelectInterval(100) 
     .setSoTimeout(100) 
     .setConnectTimeout(100) 
     .build(); 
CloseableHttpAsyncClient httpClient = HttpAsyncClients.custom() 
     .setDefaultIOReactorConfig(ioReactorConfig) 
     .build();