java - 在 CompletableFuture.allof 中处理超时并记录超时 future 的正确方法

标签 java java-8 completable-future

我已将 ItemDetails 和 ItemPriceDetails 定义如下 -

class ItemDetails {
  private int itemId;
  private int uom;
  private int zipcode;
  private String promoCode;
}

class ItemPriceDetails {
  private int itemId;
  private int uom;
  private int zipcode;
  private float totalCost;
  private float totalTax;
  private TaxDetails taxDetails;
  private DiscountDetails discountDetails;
}

InventoryTargetExecutors是提供 fetchPrice 的第三方 jar采取 ItemDetails 的功能作为输入并返回 CompletableFuture<ItemPriceDetails>作为输出。

我想使用 CompletableFuture.allof 并行调用多个 InventoryTargetExecutors具有指定超时的函数并打印 InventoryTargetExecutors在调用期间超时。

ItemDetails  ids = ...;
List<InventoryConfigExecutors> inventoryConfigExecutors = applicationContext.get("InventoryConfigExecutors");
List<CompletableFuture<Pair<ItemPriceDetails, InventoryConfigExecutors>>> priceFutures =  inventoryConfigExecutors.stream().map(ice -> Pair.of(ice.fetchPrice(ids), ice)).collect(Collectors.toList());
CompletableFuture<Void> futuresExecuted = CompletableFuture.allOf(priceFutures.toArray(new CompletableFuture[priceFutures.size()]));

我不知道如何使用 CompletableFuture.allof 使 priceFutures 超时,同时记录超时的 InventoryConfigExecutors。

最佳答案

如果使用 JDK 9 或更高版本,CompletableFuture.orTimeout 将允许您设置超时。 对于早期版本,您需要自己实现,可能是通过安排一个调用 completeExceptionally 的任务。

对于日志记录,您可以使用 whenComplete 并检查 throwable 参数,如果它存在则记录。 注意:这不区分超时或其他失败。

关于java - 在 CompletableFuture.allof 中处理超时并记录超时 future 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51329650/

相关文章:

java - 如何删除已经添加到Label中的clickHandler?

java - 从java调用hsql函数

java - 如何使用 java 8 将对象的多个属性转换为 List<String>

Java 8 Completable Future - 并行执行

java - 如何将 completableFuture.supplyAsync() 的返回类型分配给对象?

asynchronous - CompletableFuture.exceptionally 与 executor

java - 重复是因为 Oracle 太快还是多线程?

java - Java中支持接口(interface)解析的Ioc/DI

Java8 : "Translate" old ForEach Method into Lambda/Stream

java - 在 JRE 8 中使用 JavaFX, “Access restriction” 错误