我有以下要求。CompletableFuture根据第一个未来取得第一个未来等待其他期货的结果
- CreateDocument
- 对于文档创建许多发行说明(releaseNotesFuture)
- 对于文档创建多个包裹(parcelsFuture) 在1
创建的文档
public CompletableFuture<ObjectId> createDeliveryNoteDocument(String productId, List<String> releaseNotesIds) {
CompletableFuture<ObjectId> deliveryNoteFuture =
CompletableFuture
.supplyAsync(() -> sequenceServiceFeignClient.getNextValueForSequenceNameNoResponseEntity(DocumentType.DELIVERYNOTE.toString()))
.whenComplete((result, error) -> {
if (error != null)
logger.error("Unable to get next sequence number for DELIVERYNOTE sequence", error);
})
.thenCompose(seqNumber -> {
Set<ObjectAttribute> objectAttributes = new HashSet<>();
objectAttributes.add(new ObjectAttribute(Constants.Document.DOCUMENT_TYPE, DocumentType.DELIVERYNOTE.toString()));
objectAttributes.add(new ObjectAttribute(Constants.Document.DOCUMENT_NO, seqNumber));
objectAttributes.add(new ObjectAttribute(Constants.Document.PRODUCT_ID, productId));
return objectCommandService.createCustomObject(new ObjectTypeTableName(Constants.ObjectTables.DOCUMENT), objectAttributes);
});
CompletableFuture<Void> releaseNotesFuture =
deliveryNoteFuture
.thenComposeAsync(deliveryNoteId -> joinReleaseNotesWithDeliveryNote(deliveryNoteId, releaseNotesIds));
CompletableFuture<Void> parcelsFuture =
deliveryNoteFuture
.thenComposeAsync(deliveryNoteId -> changeParcelsStatusForReleaseNotes(releaseNotesIds));
return deliveryNoteFuture;
}
我如何等待releaseNotesFuture
和parcelsFuture
完成,然后返回deliveryNoteFuture
结果或错误,如果有任何releaseNotesFuture
或parcelsFuture
异常完成?
或'releaseNotesFuture.thenCombine(parcelsFuture,(x,y) - > deliveryNoteFuture.join());' – Holger
谢谢你们......你们俩。最后我使用了Holger的解决方案,因为它非常简单。 – bilak