Отмена цепочки CompletableFutureJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Отмена цепочки CompletableFuture

Сообщение Anonymous »

У меня есть цепочка асинхронных вызовов служб, которые я хотел бы отменить. Ну, на самом деле у меня есть две цепочки сервисных вызовов, идущие параллельно, и если одна увенчается успехом, я бы хотел отменить другую.

Что касается фьючерсов на гуаву, я привык отменять всю цепочку фьючерсов, отменяя последний. Похоже, я не могу сделать это с фьючерсами Java-8. Если только кто-то не знает, как это сделать.

Это ваша задача, если вы решите принять ее, это сказать мне, смогу ли я сохранить свой красивый синтаксис И отменить цепочку. В противном случае я буду писать свою собственную обертку будущего - особенно после этого вопроса.



Мои собственные тесты и попытки подписывайтесь.

@Test
public void shouldCancelOtherFutures() {
// guava
ListenableFuture as = Futures.immediateFuture("a");
ListenableFuture bs = Futures.transform(as, (AsyncFunction) x -> SettableFuture.create());
ListenableFuture cs = Futures.transform(bs, (AsyncFunction) x -> SettableFuture.create());
ListenableFuture ds = Futures.transform(cs, Functions.identity());

ds.cancel(false);
assertTrue(cs.isDone()); // succeeds

// jdk 8
CompletableFuture ac = CompletableFuture.completedFuture("a");
CompletableFuture bc = ac.thenCompose(x -> new CompletableFuture());
CompletableFuture cc = bc.thenCompose(x -> new CompletableFuture());
CompletableFuture dc = cc.thenApply(Function.identity());

dc.cancel(false);
assertTrue(cc.isDone()); // fails
}


(Представьте, что thenCompose() и Futures.transform(x, AsyncFunction) представляют собой асинхронный вызов службы.)

Я понимаю, почему армия аспирантов Дуга Ли поступила именно так. При разветвлениях цепочек все отменить?

CompletableFuture top = new CompletableFuture()
.thenApply(x -> y(x))
.thenCompose(y -> z(y));

CompletableFuture aBranch = top.thenCompose(z -> aa(z));
CompletableFuture bBranch = top.thenCompose(z -> bb(z));

...
bBranch.cancel(false);
// should aBranch be canceled now?


Я могу обойти эту проблему с помощью специальной функции-оболочки, но это портит красивый синтаксис.

private CompletableFuture transformAsync(CompletableFuture source, Function

Подробнее здесь: https://stackoverflow.com/questions/254 ... ture-chain
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»