Size: a a a

2020 May 10

ВС

Виталий Сероусов... in Java & Co
Роман Нагаев
да я понимаю, что асинхронность никуда не денется и я знаю что сахара типа async/await в джаве нет

но в тоже время я сталкиваюсь с проблемами которые мне мешают, вплоть до того что у меня абстракция сыпется
1) коллбек хелл
2) необходимость использовать CompletableFuture в методах находящихся выше в стеке вызовов и соответственно агрегировать фьючи если нужно
3) привязка к CompletableFuture в контрактах бинов

вот и пытаюсь выяснить, может есть способ получше или все также как и я коллбеки фигачат
можно использовать Project Reactor дабы избавиться от коллбек хелла
источник

РН

Роман Нагаев... in Java & Co
Виталий Сероусов
можно использовать Project Reactor дабы избавиться от коллбек хелла
а что там вместо коллбеков?
источник

MG

Max Grigoriev in Java & Co
Роман Нагаев
да я понимаю, что асинхронность никуда не денется и я знаю что сахара типа async/await в джаве нет

но в тоже время я сталкиваюсь с проблемами которые мне мешают, вплоть до того что у меня абстракция сыпется
1) коллбек хелл
2) необходимость использовать CompletableFuture в методах находящихся выше в стеке вызовов и соответственно агрегировать фьючи если нужно
3) привязка к CompletableFuture в контрактах бинов

вот и пытаюсь выяснить, может есть способ получше или все также как и я коллбеки фигачат
Если у тебя CF или Mono/Flux то откуда берется callback hell?  Если сервис у тебя реактивный то он весь пронизан Mono/Flux(как пример) а если у тебя зачем то один слой доступа к базе данных сделан реактивным и не хочется тянуть наверх реактивщину то надо его выкинуть и делать все по старинке или просто делать на вызовах типа blockOptional и ждать результата
источник

MG

Max Grigoriev in Java & Co
и вообще лучше избавляться от абстракций - а то открываешь джава код и видишь паттерн на паттерне ради паттерна. зачастую все эти абстракции вообще не нужны
источник

РН

Роман Нагаев... in Java & Co
Max Grigoriev
Если у тебя CF или Mono/Flux то откуда берется callback hell?  Если сервис у тебя реактивный то он весь пронизан Mono/Flux(как пример) а если у тебя зачем то один слой доступа к базе данных сделан реактивным и не хочется тянуть наверх реактивщину то надо его выкинуть и делать все по старинке или просто делать на вызовах типа blockOptional и ждать результата
когда я начинаю собирать данные из нескольких асинхронных методов и передавать их в другие асинхронные методы а потом в следующие (но не вложенные) при этом изменяя их в текущем слое тоже
источник

MG

Max Grigoriev in Java & Co
Роман Нагаев
когда я начинаю собирать данные из нескольких асинхронных методов и передавать их в другие асинхронные методы а потом в следующие (но не вложенные) при этом изменяя их в текущем слое тоже
пример покажи - как ты во Flux колбек можешь засунуть а внтури его еще колбек?
источник

РН

Роман Нагаев... in Java & Co
Max Grigoriev
и вообще лучше избавляться от абстракций - а то открываешь джава код и видишь паттерн на паттерне ради паттерна. зачастую все эти абстракции вообще не нужны
моя абстракция - это средство формализации и декомпозиции бизнес- процесса, если её выкинуть всё сольётся в один большой клубок
источник

MG

Max Grigoriev in Java & Co
Роман Нагаев
моя абстракция - это средство формализации и декомпозиции бизнес- процесса, если её выкинуть всё сольётся в один большой клубок
просто посмотри как работать с Flux/Mono и пойми что такое реактивщина вообще такое и для чего она нужна. пока что сплошная каша - ты даже не хочешь открыть какой нить простой туториал типа https://www.baeldung.com/reactor-core чтобы понять что к чему
источник

РН

Роман Нагаев... in Java & Co
Роман Нагаев
когда я начинаю собирать данные из нескольких асинхронных методов и передавать их в другие асинхронные методы а потом в следующие (но не вложенные) при этом изменяя их в текущем слое тоже
реактивщиной я не пользовался  а на фьючах например такое часто происходит

return repository1.findAll().thenCompose(items -> {
   return repository2.doSomething(items).thenCompose(result -> {
       return repository3.doSomethingWithBoth(items, result);
   })
})
источник

MG

Max Grigoriev in Java & Co
сделай простую цепочку
источник

MG

Max Grigoriev in Java & Co
убери скобки и ретурны и будет уже проще.  без реактивщины будет код не намного лучше.
источник

РН

Роман Нагаев... in Java & Co
Max Grigoriev
просто посмотри как работать с Flux/Mono и пойми что такое реактивщина вообще такое и для чего она нужна. пока что сплошная каша - ты даже не хочешь открыть какой нить простой туториал типа https://www.baeldung.com/reactor-core чтобы понять что к чему
на что конкретно я должен обратить внимание?
источник

РН

Роман Нагаев... in Java & Co
Max Grigoriev
сделай простую цепочку
сделать простую цепочку не получится так как третий этап зависит от первого, это не позволяет зачейнить thenCompose
источник

MG

Max Grigoriev in Java & Co
на все :) ты должен стремится сделать свой поток данных как можно проще ну и использовать реактивщину понимая для чего она. нет смысла от асинхроного Постгрес драйвера если дальше все сделано на thread per request
источник

MG

Max Grigoriev in Java & Co
Роман Нагаев
сделать простую цепочку не получится так как третий этап зависит от первого, это не позволяет зачейнить thenCompose
тогда разбивай на функции чтобы облегчать понимае типа repository1.findAll().flatMap(this::doSomething)
источник

РН

Роман Нагаев... in Java & Co
Max Grigoriev
на все :) ты должен стремится сделать свой поток данных как можно проще ну и использовать реактивщину понимая для чего она. нет смысла от асинхроного Постгрес драйвера если дальше все сделано на thread per request
в какой момент речь перешла на реактивщину? я раньше ей не пользовался и сейчас асинхронщина у меня реализована на фьючах, зачем мне приплетать ещё и mono, что мне это даст? у меня по прежнему есть монада, только она называется не CompletableFuture а Mono и есть сабскрайберы которые подписываются на её выполнение, и чейнятся я получаю возможность стримить данные, отдавая их сериями через Flux, но это не то что мне нужно, я по прежнему имею ограничения на доступ к данным и кучу коллбеков
источник

MG

Max Grigoriev in Java & Co
как по мне то ты занимаешься демагогией. У тебя есть что то возращающее фьючу - это сделал явно не я.  но тебе как то с этим надо работать а не плакать что у тебя проблемы с доступом.  я сказал несолько раз - от асинхрощины нет смысле если у тебя не все асинзронное и нет понимания зачем это вводится. Mono/Flux я предлагаю тк с ними гораздо удобней работать чем с Фьючами. Плюс куча библиотек работают именно с ними.  Ограничений у тебя вообще нет - тебе просто не нравится код который получается толи потому что у вас архитектура кривая толи потому что тебе просто асинхронщина не нравится.
источник

MG

Max Grigoriev in Java & Co
те к примеру для меня такой код https://pastebin.com/EtZqk7as понятный и простой
источник

MG

Max Grigoriev in Java & Co
и особо разницы между блокирующим кодом нет.
источник

РН

Роман Нагаев... in Java & Co
Max Grigoriev
как по мне то ты занимаешься демагогией. У тебя есть что то возращающее фьючу - это сделал явно не я.  но тебе как то с этим надо работать а не плакать что у тебя проблемы с доступом.  я сказал несолько раз - от асинхрощины нет смысле если у тебя не все асинзронное и нет понимания зачем это вводится. Mono/Flux я предлагаю тк с ними гораздо удобней работать чем с Фьючами. Плюс куча библиотек работают именно с ними.  Ограничений у тебя вообще нет - тебе просто не нравится код который получается толи потому что у вас архитектура кривая толи потому что тебе просто асинхронщина не нравится.
я понял тебя, меня беспокоит не неподходящая реализация монады и не отсутствие понимания реактивщины

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