Войти Регистрация
Конкурентность

16. Оформление заказа на CompletableFuture

Средняя

Java · 33 строк

checkout вызывается по кнопке «Оформить заказ». Сервис цен и сервис доставки отвечают по сети за 50–300 мс. После возврата из метода клиенту показывают «Заказ оформлен».

Отметьте строки с ошибками.

В работе: Бэкенд оформления заказа.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 2 вопроса про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
CompletableFutureexceptionallyForkJoinPoolобработка ошибок

Источник: на данных Ozon: корзина и оформление заказа. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import java.util.List;
  2. import java.util.concurrent.CompletableFuture;
  3. import java.util.concurrent.ExecutorService;
  4. public class CheckoutService {
  5. private final ExecutorService io;
  6. private final PriceClient prices;
  7. private final DeliveryClient delivery;
  8. private final OrderRepo orders;
  9. public CheckoutService(ExecutorService io, PriceClient prices, DeliveryClient delivery, OrderRepo orders) {
  10. this.io = io;
  11. this.prices = prices;
  12. this.delivery = delivery;
  13. this.orders = orders;
  14. }
  15. // После возврата клиенту показывают «Заказ оформлен».
  16. public void checkout(long cartId, List<Long> skus) {
  17. CompletableFuture<Long> total = CompletableFuture
  18. .supplyAsync(() -> prices.sum(skus), io)
  19. .exceptionally(e -> 0L);
  20. CompletableFuture<Long> shipping = CompletableFuture
  21. .supplyAsync(() -> delivery.cost(cartId));
  22. total.thenCombine(shipping, Long::sum)
  23. .thenAccept(sum -> orders.create(cartId, sum));
  24. }
  25. }
  26. interface PriceClient { long sum(List<Long> skus); }
  27. interface DeliveryClient { long cost(long cartId); }
  28. interface OrderRepo { long create(long cartId, long totalKop); }