Spring Boot 2 Async делает вызов, но не возвращает ответ - PullRequest
0 голосов
/ 07 декабря 2018

Мой асинхронный режим работает наполовину.Вызов выполняется асинхронно, но когда возвращается результат, он не попадает в код, который у меня есть.

Класс загрузочного приложения Spring содержит @EnableAsync.

@Service
public class MyService() {

    private MyClient client;

    @Autowired
    public MyService(MyClient client) {
        this.client = client;
    }

    public String callHttpService() {
        Future<String> asyncResponse = client.submitOrder("test");

        String response = null;

        if(asyncResponse.isDone()) {

            // client call made and result comes back but never comes in here
            response = asyncResponse.get();
        }

        return response;
     }
}

@Component
public class MyClient() extends RestClient {

    @Async
    public Future<String> submitOrder(String request) {
         String response;
         try {
            response = super.invoke(request, HttpMethod.POST);
         } catch(RestInvocationException e) {
            .....
         }

          return new AsycResult<>(response);
    }
}

I 'мы даже попробовали другой вариант ответа моего клиента, где я делаю: response = new AsyncResult<>(super.invoke(request, HttpMethod.POST)); return response;

Я не понимаю, почему, когда я выполняю вызов и получаю ответ, он не попадает в мой блок .isDone().

1 Ответ

0 голосов
/ 07 декабря 2018

Вам нужно подождать, пока ваш запрос не будет выполнен, например:

while (true) {
    if (asyncResponse.isDone()) {
        response = asyncResponse.get();
        break;
    }
    Thread.sleep(1000);
}

Когда вы проверяете результат isDone результата Future, он может быть ложным, поскольку ваш запрос выполняется асинхроннои для его создания требуется некоторое время.

Просто отметим, что метод isDone не блокирует выполнение до тех пор, пока работа не будет завершена, он просто немедленно возвращает результат независимо от того, выполнена ваша работа или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...