Хотите создавать асинхронные вызовы REST, что использовать, когда? - PullRequest
0 голосов
/ 07 января 2019

Я хотел, чтобы асинхронное решение вызывало микросервисы, поэтому я пробовал и CompletableFuture, и ListenableFuture. Проблема, с которой я столкнулся в CompletableFuture, заключается в том, что если я хочу вызвать n вызовов асинхронных вызовов, я не могу использовать механизм зацикливания (возможно, потребуется объединить их) и каждая задача должна быть передана в библиотеку вручную.

С ListenableFuture я ожидаю точного ResponseEntity как того, на что ответили другие микроуслуги, включая сбои, но это снова должно быть добавлено в результате в список. Будет ли разумно использовать AsyncRestTemplate, если мы используем ListenableFuture от guava.

В настоящее время я не могу использовать Reactor или rxJava из-за ограничений проекта.

public List<DeferredResult<?>> getAsync(List<AsyncLoadData> loaddata) {
    List<AsyncTask> tasks = new ArrayList<>();
    for (int i = 0; i < loaddata.size(); i++) {
        AsyncTask task = new AsyncTask(resttemplate, loaddata.get(i));
        tasks.add(task);

    }
    ListeningExecutorService pool = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(loaddata.size()));
    List<DeferredResult<?>> retResponses = new ArrayList<>();
    for (int i = 0; i < tasks.size(); i++) {


        ListenableFuture<ResponseEntity<?>> stage = pool.submit(tasks.get(i));
        Futures.addCallback(stage, new FutureCallback<ResponseEntity<?>>() {
            @Override
            public void onSuccess(ResponseEntity<?> result) {
                DeferredResult<ResponseEntity<?>>  def=new DeferredResult<>();
                def.setResult(result);
                retResponses.add(def);
            }

            @Override
            public void onFailure(Throwable t) {
                DeferredResult<?>  def=new DeferredResult<>();
                def.setErrorResult(t);
                retResponses.add( def);

            }

        });
    }
    return retResponses;

}
...