5.1 metodo sendAsync()

Puoi anche inviare richieste asincrone usando HttpClient. Di solito questo viene fatto in tre casi.

Il primo caso è che la richiesta impiegherà molto tempo , ad esempio l'invio/ricezione di un file. Questa operazione viene quindi avviata ed eseguita in modo asincrono.

Il secondo caso è che devi inviare richieste molto spesso e non vuoi aspettare una risposta dalla richiesta precedente prima di inviare quella successiva.

E infine, il terzo caso: il risultato della tua richiesta non è importante per te . Ad esempio, fai uno screenshot del tuo schermo una volta al minuto e lo invii al server. Cioè, la logica della tua applicazione presuppone che ci siano molte richieste e non tutte le raggiungano. Quindi è conveniente lavorare secondo il principio: invia e dimentica.

Per inviare una richiesta asincrona, è necessario chiamare un metodo sendAsync()su un oggetto della classe HttpClient. Questo metodo esce immediatamente e restituisce un CompletableFuture<HttpResponse>. Con esso, puoi tenere traccia di quando la richiesta viene effettivamente eseguita, nonché eseguire un determinato codice dopo che la richiesta è stata completata. Esempio:

HttpClient client = HttpClient.newBuilder().build();

CompletableFuture<HttpResponse<String>> response = client.sendAsync(
        request,
        HttpResponse.BodyHandlers.ofString()
);

Il metodo sendAsync()restituisce un oggetto CompletableFutureche contiene al suo interno un HttpResponse, che contiene la stringa che il server restituirà.

5.2 Il metodo executor(), ExecutorService

Inoltre, HttpClient consente di passargli ExecutorService(un pool di thread) che verrà utilizzato per eseguire richieste asincrone. In realtà, nelle applicazioni Java lato server, questo viene sempre fatto.

Dopotutto, se per ogni richiesta in arrivo alla tua API lancerai diverse richieste asincrone da qualche altra parte, non avrai abbastanza thread. Esempio:

ExecutorService executorService = Executors.newFixedThreadPool(2);

CompletableFuture<HttpResponse<String>> response1 = HttpClient.newBuilder()
  .executor(executorService)
  .build()
  .sendAsync(request, HttpResponse.BodyHandlers.ofString());

CompletableFuture<HttpResponse<String>> response2 = HttpClient.newBuilder()
  .executor(executorService)
  .build()
  .sendAsync(request, HttpResponse.BodyHandlers.ofString());

Se il pool di thread non è impostato, il valore predefinito è .java.util.concurrent.Executors.newCachedThreadPool()