正确的方法来处理CompletableFuture.allof中的超时并记录超时的期货

时间:2018-07-13 16:47:34

标签: 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是第三方jar,提供了fetchPrice函数,这些函数将ItemDetails作为输入并返回CompletableFuture<ItemPriceDetails>作为输出。

我想使用CompletableFuture.allof函数以指定的超时并行调用多个InventoryTargetExecutor,并打印调用期间超时的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超时,并同时记录超时的InventoryConfigExecutor。

1 个答案:

答案 0 :(得分:0)

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

对于日志记录,您可以使用whenComplete并检查throwable参数,并记录是否存在。 注意:这不能区分超时还是其他故障。