我有以下要求。
这是我当前的代码:
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
结果或错误? 最佳答案
除了返回deliveryNoteFuture
之外,您还必须具有在CompletableFuture
和releaseNotesFuture
完成时完成的parcelsFuture
。此外,您希望将来可以将其合并到deliveryNoteFuture
的结果中,因为如果整个链都成功,您希望其ObjectId
。
就像是
return CompletableFuture.allOf(releaseNotesFuture, parcelsFuture).thenComposeAsync(r -> deliveryNoteFuture);
由于
releaseNotesFuture
和parcelsFuture
都取决于deliveryNoteFuture
,因此deliveryNoteFuture
的错误将通过所有这些链传播。同样,如果
releaseNotesFuture
或parcelsFuture
中的任何一个失败,那么 CompletableFuture
returned by allOf
将以该失败的原因完成,并且该原因将传播到thenComposeAsync
返回的将来。否则,将传递deliveryNoteFuture
的结果。与Holger suggests一样,由于您只有这两种期货,因此您也可以使用
thenCombine
releaseNotesFuture.thenCombineAsync(parcelsFuture, (x, y) -> deliveryNoteFuture.join());
在这里,
join()
不会被阻止,因为deliveryNoteFuture
肯定已经完成。同样,如果deliveryNoteFuture
最初失败,则其原因将沿链传播,并以CompletableFuture
返回的thenCombineAsync
结尾。