Apache async HttpClient pas rapide
Je suis assez nouveau à Apache http client et cherche à obtenir le statut de code à partir d'un site web. Trouvé l'exemple suivant sur Apache http tutoriel.
import java.util.concurrent.CountDownLatch;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.concurrent.FutureCallback;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
public class Abc {
static long d2;
public static void main(final String[] args) throws Exception {
d2=System.currentTimeMillis();
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(3000)
.setConnectTimeout(3000).build();
CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
.setDefaultRequestConfig(requestConfig)
.build();
try {
httpclient.start();
final HttpGet[] requests = new HttpGet[] {
new HttpGet("http://192.168.26.175:8080/examples/eye/abc10000.jsp")
};
final CountDownLatch latch = new CountDownLatch(1);
for (int v=0;v<1000;v++) {
httpclient.execute(requests[0], new FutureCallback<HttpResponse>() {
public void completed(final HttpResponse response) {
latch.countDown();
System.out.println(requests[0].getRequestLine() + "->" + response.getStatusLine());
}
public void failed(final Exception ex) {
latch.countDown();
System.out.println(requests[0].getRequestLine() + "->" + ex);
}
public void cancelled() {
latch.countDown();
System.out.println(requests[0].getRequestLine() + " cancelled");
}
});
}
latch.await();
System.out.println("Shutting down");
} finally {
httpclient.close();
}
System.out.println("Done");
long d1=System.currentTimeMillis();
System.out.println(d1-d2);
}
}
Est-il vraiment asynchrone ou sont les appels effectués en série. Ce qui doit être fait pour faire des appels asynchrones et plus rapide.
Vous devez vous connecter pour publier un commentaire.
Que les demandes passent par le même itinéraire à la suite des modifications devront être apportées.
D'abord et avant tout:
CloseableHttpAsyncClient
instances sont très coûteux. S'il vous plaît ne PAS créer un nouveauCloseableHttpAsyncClient
pour chaque demande. C'est comme la création d'un nouveau processus de navigateur pour chaque lien, cliquez sur, est complètement inutile et est très lent. Il est fortement recommandé d'utiliser la mêmeCloseableHttpAsyncClient
exemple pour l'ensemble de la durée de vie d'un composant logique.À peu près dans tous les cas, un blocage client est susceptible d'être considérablement plus rapide qu'un non-bloquant (NIO base) un (tant que le nombre de demandes simultanées est ci-dessous, disons, 1000). Sauf si vous êtes la construction d'un proxy, de la sorte, vous pourriez être beaucoup mieux servis par un blocage de la client HTTP comme Apache HttpClient.
setMaxConnPerRoute(500)
que toutes les demandes qui sont passés par le même itinéraire. Grâce bdw!