DeferredResult не устанавливает результат повторно, если мы установили его изначально.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 DeferredResult не устанавливает результат повторно, если мы установили его изначально.

Сообщение Anonymous »

У меня есть требование: я хочу отправить статус = «в работе» сразу после получения запроса, а затем вызвать другой API, чтобы получить ответ. Для возврата результата требуется около минуты. Я использую AWS API Gateway, у которого жесткий тайм-аут составляет 30 секунд. Поэтому я хочу опросить результаты внешнего приложения, вызывая API каждые 10 секунд, пока мы не получим ответ от API. Мой приведенный ниже код работает асинхронно и извлекает записи, но никогда не устанавливает ответ в deferredResult. Таким образом, даже после того, как мы получили ответ от стороннего API, асинхронный вызов продолжает выполняться, потому что мы устанавливаем 10 итераций из внешнего интерфейса, прежде чем мы покажем тайм-аут из внешнего интерфейса.
Пожалуйста, поправьте меня, где я я иду не так.

Код: Выделить всё

@EnableAsync
@RestController
@Slf4j
@RequestMapping("/api")
public class MyController {

private final ThridPartyApi thridPartyApi;
private MyRequest asyncRequest;

@PostMapping("/big-data")
@ResponseStatus(HttpStatus.OK)
public DeferredResult getBigData(@RequestBody MyRequest request) {

if (asyncRequest == null) {
asyncRequest = request;
}
DeferredResult deferredResult = new DeferredResult(80000L);
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();

CompletableFuture.supplyAsync(() -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
try {
return thridPartyApi.getBigData(request);
} catch (IOException e) {
throw new RuntimeException(e);
}
}).thenAccept(response -> {
if (!deferredResult.isSetOrExpired()) {
deferredResult.setResult(AsyncApiResponse.createCompleted(response));
}
}).exceptionally(ex -> {
if (!deferredResult.isSetOrExpired()) {
deferredResult.setErrorResult(AsyncApiResponse.createCompleted(null));
}
return null;
});

if (!deferredResult.hasResult()) {
log.debug("Request processing is in progress >>>>>");
DeferredResult dr = new DeferredResult();
dr.setResult(AsyncApiResponse.createInProgress());
return dr;
}

log.debug("Request processing is done");
return deferredResult;
}

}
Я вызываю POST /api/big-data несколько раз в цикле из 10. Сразу после вызова я получаю ответ «в процессе». Но никогда не получите ответ, даже если все вызовы (счетчик 10) исчерпаны.
Похоже, deferredResult.setResult(AsyncApiResponse.createCompleted(response)) устанавливает результат, но когда дело доходит до строки, if (!deferredResult. hasResult()) Я вижу, что deferredResult не установлен.
Я ожидаю, что нашел его установленным, и, следовательно, if (!deferredResult.hasResult()) оценивается как false и возвращает deferredResult; вызывается с установленным значением.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -initially
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • DeferredResult не устанавливает результат повторно, если мы установили его изначально.
    Anonymous » » в форуме JAVA
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Хорошая ли идея использовать `DeferredResult>`
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Хорошая ли идея использовать `DeferredResult>`
    Anonymous » » в форуме JAVA
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как перейти к другому занятию вместо темы, которую мы установили для postsplash
    Гость » » в форуме JAVA
    0 Ответы
    10 Просмотры
    Последнее сообщение Гость
  • Как перейти к другому занятию вместо темы, которую мы установили для postsplash
    Гость » » в форуме Android
    0 Ответы
    8 Просмотры
    Последнее сообщение Гость

Вернуться в «JAVA»