У меня есть цепочка асинхронных вызовов служб, которые я хотел бы отменить. Ну, на самом деле у меня есть две цепочки сервисных вызовов, идущие параллельно, и если одна увенчается успехом, я бы хотел отменить другую.
Что касается фьючерсов на гуаву, я привык отменять всю цепочку фьючерсов, отменяя последний. Похоже, я не могу сделать это с фьючерсами 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
Отмена цепочки CompletableFuture ⇐ JAVA
Программисты JAVA общаются здесь
1729718066
Anonymous
У меня есть цепочка асинхронных вызовов служб, которые я хотел бы отменить. Ну, на самом деле у меня есть [b]две[/b] цепочки сервисных вызовов, идущие параллельно, и если одна увенчается успехом, я бы хотел отменить другую.
Что касается фьючерсов на гуаву, я привык отменять всю цепочку фьючерсов, отменяя последний. Похоже, я не могу сделать это с фьючерсами Java-8. [b]Если только кто-то не знает, как это сделать.[/b]
[b]Это ваша задача, если вы решите принять ее[/b], это сказать мне, смогу ли я сохранить свой красивый синтаксис И отменить цепочку. В противном случае я буду писать свою собственную обертку будущего - особенно после этого вопроса.
Мои собственные тесты и попытки подписывайтесь.
@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
Подробнее здесь: [url]https://stackoverflow.com/questions/25417881/canceling-a-completablefuture-chain[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия