web-dev-qa-db-fra.com

Comment pouvons-nous faire un appel api asynchrone REST en Java?

J'utilise Spring RestTemplate et je souhaite appeler un autre service qui ne renvoie aucun corps de réponse. Donc, je ne veux pas attendre la réponse. Donc, c'est juste tirer et oublier, et continuer avec le code restant. Je pense à créer un nouveau thread pour ce faire, mais je ne sais vraiment pas quelle est la bonne approche.

2
user10937286

Il existe de nombreuses façons de déclencher la demande à l'aide de AsyncRestTemplate

La manière la plus simple est similaire à restTemplate et à la méthode d'échange d'appels:

AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
JSONObject json = new JSONObject();
json.put("firstName","testUser");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> requestEntity = new HttpEntity<String>(json.toString(), headers);

Class<String> responseType = String.class;
ListenableFuture<ResponseEntity<String>> future = asyncRestTemplate.exchange("https://xxxxx.com/", HttpMethod.POST, requestEntity,responseType );

// If you want for the result then you can use 
 try {
        //waits for the result
        ResponseEntity<String> entity = future.get();
        //prints body source code for the given URL
        log.info(entity.getBody());
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
}

Si nous voulons jouer avec l'échec (scénario de secours) ou le succès dans ce cas, nous pouvons utiliser le code ci-dessous:

AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
JSONObject json = new JSONObject();
json.put("firstName","testUser");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> requestEntity = new HttpEntity<String>(json.toString(), headers);

 //final DeferredResult<String> result = new DeferredResult<>();
 ListenableFuture<ResponseEntity<String>> future = 
 asyncRestTemplate.postForEntity("https://xxxx.com", requestEntity, String.class);

  future.addCallback(new ListenableFutureCallback<ResponseEntity<String>>() {

 @Override
 public void onFailure(Throwable ex) {
// insert into the table or log or some other decision
 log.info(ex.getMessage());
 }

        @Override
        public void onSuccess(ResponseEntity<String> result) {
            log.info(result.getBody());
            log.info("Sucess");
        }
    });
0
Ashish Girdhar