@scala_ru

Страница 1480 из 1499
Henadz
22.05.2018
15:25:33
javap выдаёт только шапку класса и сигнатуры методов

Alexandr
22.05.2018
15:26:15
Хм. Когда я последнийраз смотрел, он выдавал все.. JAD?

Alexandr
22.05.2018
15:28:02
javap выдаёт только шапку класса и сигнатуры методов
Ты прав. Это у меня в alias пробит javap и jad.

Google
Alexandr
22.05.2018
15:28:43
http://jd.benow.ca

Henadz
22.05.2018
15:31:08
jad сработал, спасибо

Vladimir
22.05.2018
15:35:03
/toxic

OlegYch
22.05.2018
15:42:36
jad сработал? странно

последни раз он и на жаве треш выдавал

jd-gui более менее, fernflower получше

fernflower в идею встроен

Vadim
22.05.2018
16:07:59
его еще где-то на гибхабе можно найти и собрать отдельно

Eugene
22.05.2018
16:17:18
Вопрос знатокам doobie, у него на сайте написано You can use a for comprehension to compose any number of ConnectionIO programs, and then call .transact(xa) on the result. All of the composed programs will run in the same transaction. For this reason it’s useful for your APIs to expose values in ConnectionIO, so higher-level code can place transaction boundaries as needed. Это ок и понятно, но в таком случае higher-level code полностью завязан на ConnectionIO и уже не может работать в другой монаде, например в monix Task Получается что либо вся бизнес логика живет в ConnectionIO и я имею одну транзакцию либо на каждый запрос к репе надо делать трансформацию из ConnectionIO в Task и это уже куча транзакций

как делаете вы? нужна 1 транзакция на кусок бизнес логики, но при этом хотелось бы работать в Monix Task например

Alexandr
22.05.2018
16:18:43
Можно завязываться не на ConnectionIO, а на F[_]

Eugene
22.05.2018
16:19:19
у F[_] нет метода transact(xa) который и выполняет транзакцию

Alexandr
22.05.2018
16:20:00
Зато у конвертора, который превращает F[_] в Task, он есть

Google
OlegYch
22.05.2018
16:20:41
чоза конвертор

Eugene
22.05.2018
16:20:55
не понимать

надо работать в одной монаде - желательно в одном из инстансов Async и делать так чтобы это была 1 транзакция

Alexandr
22.05.2018
16:21:32
Сделали все что нужно с F[_], вызвали f2task(myResultOfTypeF)

f2Task это что-то типа def f2Task(q: ConnectionIO) = transactor.flatMap(xa => q.transact(xa))

Eugene
22.05.2018
16:24:53
q.transact(xa) в данном примере выдаст мне monix.Task потому что в этом эффекте я работаю

и как бы тут нужно натуральное преобразование тогда а не флатмап

Alexandr
22.05.2018
16:28:46
val fResult: F[Int] = for { a <- doobieFunc1() b <- doobieFunc2() c <- doobieFunc3() } yield a + b + c val task1 = f2Task(fResult) val tResult: Task[Int] = for { d <- task1 e <- taskFunc() } yield d + e

Сначала сделали все что хотим в терминах F[_], потом сконвертили результат в таск и работаем с ним

Eugene
22.05.2018
16:31:31
это все понятно да а теперь представим что есть такой сценарий - идем в базу - обрабыватыем полученный объект в Task - записываем результат в базу

то есть в примере выше сразу после taskFunc идет еще один поход в базу

Alexandr
22.05.2018
16:32:44
Тогда это не получится сделать в одной транзакции

Eugene
22.05.2018
16:32:50
ну и не ограничиваем свою фантазию - походы в базу и обработка может чередоваться в любой последовательности

хм это странное ограничение

ну то есть это скорее ограничение выбранного механизма (монады) а не принципиальная невозможность

Alexandr
22.05.2018
16:33:58
Если так нужно все делать в одной транзакции, почему не сделать всю работу в функциях doobieFunc1(), doobieFunc2(), ..., doobieFuncN(), а потом просто сконвертить в таск?

Eugene
22.05.2018
16:33:58
никто не мешает в самом конце цепочки композиций сделать commit

потому что конвертация в таск - это граница транзакции

Р
22.05.2018
16:34:35
Что-то не видно комитов новых с 9 мая, кто-нибудь знает почему? https://github.com/scalameta/metals

Alexandr
22.05.2018
16:34:47
потому что конвертация в таск - это граница транзакции
Сконвертить в конце, в не посреди выполнения работы

Google
Eugene
22.05.2018
16:35:42
Сконвертить в конце, в не посреди выполнения работы
значит и остальная логика должна работать в ConnectionIO иначе просто не построишь композицию монад

Alexandr
22.05.2018
16:36:51
Ну, пытаться вызвать методы, возвращающие Task внутри транзакции, это имхо как-то стремно

Как минимум

В транзакции должно выполняться что-то очень быстрое

А не таски, которые делают rest-запросы к внешней системе ?

Точно так же как вызывать очень тяжелые блокирующие операции внутри таска с пулом в 3 потока неправильно

Eugene
22.05.2018
16:39:13
да проще - cpu intensive операцию которую хочется запускать в отдельном пуле например

не обязательно REST

пока я вижу эти ограничения из-за монад а не из-за соображений о том что не надо запускать транзакцию в тасках

ладно спасибо, напишу пока в SO вопрос :)

Denis
22.05.2018
16:45:22
Можно сделать свой TxManager, который используешь в тасках

Создаешь transactor val connection = dataSource.getConnection connection.setAutoCommit(false) Transactor[Task, Connection]( connection, c => Task.pure(c), KleisliInterpreter[Task].ConnectionInterpreter, Strategy.void )

Denis
22.05.2018
16:46:42
В конце своей транзакции import cats.implicits._ import doobie.free.connection import doobie.free.connection._ trasactor.rawTrans.apply(connection.commit *> connection.close)

Полностью код скинут не могу

Eugene
22.05.2018
16:47:10
да интересно а что возвращает слой репы? ConnectionIO?

Denis
22.05.2018
16:47:21
Task

Eugene
22.05.2018
16:49:17
то есть в репе смело делать .transact(xa) но потому что мы подсунули свой транзактор ничего не будет происходить?

Denis
22.05.2018
16:52:03
ага

Eugene
22.05.2018
16:52:53
спасибо буду в эту сторону смотреть :)

Denis
22.05.2018
16:53:07
И код легче становится Ты оперируешь своими объектами, clean architecture и все такое

Google
Eugene
22.05.2018
16:53:20
да звучит круто

OlegYch
22.05.2018
16:58:36
а потом забыл закомитить

Alexandr
22.05.2018
16:58:40
Выглядит как хак, но если уж так решать проблему, то проще сделать val noTransactionsXa = Transactor.before.set(xa, FC.unit)

Но что потом? Тащить транзактор во все классы и коммитить руками? ? Звучит не очень

Eugene
22.05.2018
17:00:59
зачем везде тащить? есть 1 сервис http4s, в самом конце обработки закомитить

пока других вариантов открыть транзакцию на всю обработку и закомитить в самом конце я не нашел ) может еще что-то на stack overflow напишут посмотрим

Alexandr
22.05.2018
17:02:07
Полностью вся обработка запроса внутри транзакции? ? Жестоко

Eugene
22.05.2018
17:03:17
Старый добрый паттерн для веба )

Nikolay
22.05.2018
17:21:00
https://twitter.com/jdegoes/status/998900201535389701?s=19

Admin
ERROR: S client not available

Nikolay
22.05.2018
17:21:23
Жирно

Sergey
22.05.2018
17:26:44
Это да, в кложе не так, сильно лучше в этом плане

Aleksei
22.05.2018
17:39:42
так транзактор же превращает ConnectionIO[A] в Monad[A]

короче я пропустил всё =)

Eugene
22.05.2018
17:52:25
так транзактор же превращает ConnectionIO[A] в Monad[A]
Он не только превращает, он и исполняет ее. В итоге каждый поход в БД превращается в свою независимую транзакцию а хочется все в одной

Александр
22.05.2018
18:01:35
Где сейчас самый удобный моноколь\линзы\etc ? есть pure scala проект, думаю что вкатывать

Nick
22.05.2018
18:02:07
В монокле

Eugene
22.05.2018
18:02:20
Я quicklens использую. Не совсем линзы но смысл тот же и очень удобно

Nick
22.05.2018
18:03:24
How do I do several things in the same transaction? You can use a for comprehension to compose any number of ConnectionIO programs, and then call .transact(xa) on the result. All of the composed programs will run in the same transaction. For this reason it’s useful for your APIs to expose values in ConnectionIO, so higher-level code can place transaction boundaries as needed.

Eugene
22.05.2018
18:04:19
Я с этого и начал вопрос

Google
Александр
22.05.2018
18:06:03
Nick
22.05.2018
18:06:51
Transact ничего не исполняет, а делает монадку

Aleksei
22.05.2018
18:15:31
Он не только превращает, он и исполняет ее. В итоге каждый поход в БД превращается в свою независимую транзакцию а хочется все в одной
т.е. если я в одной форе несколько фри композирую то оно не в одной транзакции будет выполняться,

?

Eugene
22.05.2018
18:15:48
Transact ничего не исполняет, а делает монадку
Которая исполнятся когда запускаешь эффект, например runUnsafe

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

Александр
22.05.2018
18:17:04
Я quicklens использую. Не совсем линзы но смысл тот же и очень удобно
А оно умеет если внутренности ещё в option все попрятаны?

Oleg
22.05.2018
18:17:21
если есть монокль

Eugene
22.05.2018
18:17:31
Option это список так что умеет

Oleg
22.05.2018
18:17:47
Option это список так что умеет
опшон - это не список

Eugene
22.05.2018
18:18:53
Я грубо. Iterable. А у quicklens есть each который позволяет пробежаться по коллекции

Oleg
22.05.2018
18:19:28
Option это список так что умеет
Но справедливости ради стоит упомянуть, что в кметтовских lens тоже нет Optional и в его рли юзают Traversal

Александр
22.05.2018
18:19:47
если есть монокль
Монокль видимо умеет

Eugene
22.05.2018
18:20:31
Монокль видимо умеет
Монокль умеет изменить сразу много полей?

Oleg
22.05.2018
18:21:40
Монокль умеет изменить сразу много полей?
сразу много полей разных типов?

или пробежаться по коллекции?

Eugene
22.05.2018
18:22:55
Взять и изменить половину полей кейскласса

Oleg
22.05.2018
18:23:59
я полашаю, что для монокля это просто композиция функций

Andrey
22.05.2018
18:24:29

Страница 1480 из 1499