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 МБ.

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