
Bulat
22.06.2018
12:38:05

Konstantine
22.06.2018
12:41:33
На вкус и цвет.
О чем спор вообще.

dimiii
22.06.2018
12:45:20

Alex
22.06.2018
12:45:59

Google

Konstantine
22.06.2018
12:47:14

Igor
22.06.2018
12:52:41
Пасаны, а такое вообще законно?
- Сделать в Kotlin интерфейс с suspend функцией
- Отнаследовать его в Java

Alexander
22.06.2018
12:54:13
Законно, но работать не будет без койла и какой-то матери
В Java он будет требовать первым аргументом Continuation. Можно его конечно руками создать, но...

dimiii
22.06.2018
12:54:43

Roman
22.06.2018
13:48:17

Sergey
22.06.2018
14:11:57
как-то можно узнать сколько запущено корутин? хочется вывести это в метрики и следить за тем чтобы они не утекали никуда. в го эти данные доступны

Руслан
22.06.2018
14:17:25
Посмотреть сколько классов которые : Continuation?

Sergey
22.06.2018
14:21:45
? надо попробовать

Kirill
22.06.2018
14:27:26
этого будет не достаточно

Руслан
22.06.2018
14:29:34
Конечно, нужно инструментировать каждую корутину, чтобы в начале она говорила что работает, а потом что нет? Или дампить треды и проверять есть ли в них resume? Что конкретно хочется посчитать

Kirill
22.06.2018
14:30:42
> Или дампить треды и проверять есть ли в них resume?
так кстати тоже можно :)

Google

Тимур
22.06.2018
14:33:49
как это дампить треды?
спящие корутины же не привязаны к тредам, их там может хоть миллион спать в куче

Kirill
22.06.2018
14:35:19

Тимур
22.06.2018
14:36:30
ну как я понимаю, это не особо интересно
сейчас их может работать столько, сколько потоков в пуле, не больше
интересны утечки, что мы их там плодим, спать укладываем и они бесконечно копятся

Руслан
22.06.2018
14:38:09

Тимур
22.06.2018
14:38:34
но в этом задача не сильно отличается от утечки обычных объектов
дампать аллоцированные объекты и смотреть что именно там утекло

Руслан
22.06.2018
14:41:47
в kotlinx.coroutines есть еще COROUTINE_ID. Который в дебаге виден
Обычный счетчик

dimiii
22.06.2018
14:43:15
А накидайте пожалуйста минимальный рабочий пример такой утечки, если не сложно.

Sergey
22.06.2018
14:49:11

Руслан
22.06.2018
14:51:54

dimiii
22.06.2018
14:53:21

Vladimir
22.06.2018
14:54:00

Руслан
22.06.2018
14:54:12

Sergey
22.06.2018
14:54:18
еще б идея блокирующие операции помечала иконкой как для suspend ?

Руслан
22.06.2018
14:55:31
А где утечка?
Просто в джаве "утечка" это слегка странно слово) да можно там про баги какие-то в gc вспонить, или про неочевидности inner классов.

Sergey
22.06.2018
14:59:45
как вы кстати боритесь с блокирующими операциями? все что не уверены заворачиваете в withContext?

Руслан
22.06.2018
14:59:48
Можно еще этот тред почитать https://github.com/Kotlin/kotlinx.coroutines/issues/326
И вот в таком стиле пишу методы:
override suspend fun getByEmail(email: String): ToolsUserDto? = elastic {
// ...
}

Google

Sergey
22.06.2018
15:03:09
хм, спс
а как ловить тех которые просочились в мейн треды и начали там блочить все?

Alexander
22.06.2018
15:04:01
Это как?

Sergey
22.06.2018
15:04:29
провтыкали где-то вызов jdbc и он в коммон пуле выполнился
и ушел в себя на 10 секунд, к примеру

Руслан
22.06.2018
15:04:58
В квазаре есть такая тема что он пишет что какая-то долгая операция блочила тред

Sergey
22.06.2018
15:05:20
актуально при миграции текущей системы на netty с корутинами

Alexander
22.06.2018
15:06:31
Ну я бы просто вставил функцию на проверку треда. То есть делаем if(Thread.currentThread из корутин тред){ убить всех }
JavaFX так делает если вызов не на UI треде

Руслан
22.06.2018
15:15:15
А вообще опять же инструментация поможет.

Vladimir
22.06.2018
15:17:56
провтыкали где-то вызов jdbc и он в коммон пуле выполнился
Вижу два варианта:
1. Обернуть пул в нечто, что будет следить за временем выполнения каждого вызова и ругаться, если оно превышает заданное (так делается в Vert.x)
2. Обернуть соединение JDBC в нечто, что будет ругаться, будучи вызванным в главном потоке (так с некоторыми операциями делает Android)

Sergey
22.06.2018
15:18:55
ага, всем спасибо, буду смотреть варианты

Dmitriy
23.06.2018
03:14:29
всем привет, подскажите, как на котлине сделать то, что в джаве выглядит так
logger.debug(() -> "some message");
если записать просто
logger.debug({ "some message" }), то он пытается вызвать функцию не с той сигнатурой
вместо void debug(Supplier<?> msgSupplier); он пытается вызвать void debug(MessageSupplier msgSupplier), в итоге компиляция не проходит

Жабра
23.06.2018
04:09:50

Алексей
23.06.2018
04:14:41

Павел
23.06.2018
05:02:47
А так же logger.debug{->"message"}
А лучше использовать что-то типа mu logging

Dmitriy
23.06.2018
07:52:45
спасибо )

Google

Алексей
23.06.2018
08:20:51
Хорошо:)

Quantum Harmonizer
23.06.2018
10:05:35

Mikhail
23.06.2018
11:54:36
Еще немного и войдешь во вкус)

1337
23.06.2018
11:59:03
попробуй еще сгенерировать геттеры и сеттеры в идее:)
там себя совсем крутым чувствуешь, сотни кода за секунды

Yehor
23.06.2018
12:58:06
кто знает как получить абсолютный путь к файлу скрипта kts какой выполняется?

Руслан
23.06.2018
13:00:20

Yehor
23.06.2018
13:11:47
Paths.get(".").toAbsolutePath()?
это моя текущая директория откуда я запустил скрипт.
$ ls -R
> /home/scripts/foo.kts
$ pwd
> /home
$ kotlinc scripts/foo.kts
> /home
а я хочу получить
$ pwd
> /home
$ kotlinc scripts/foo.kts
> /home/scripts/foo.kts

Руслан
23.06.2018
13:25:23
Ага, я понял.
1. Для чего это нужно? может сможем предложить workaround красивый
2. Как вариант написать свою обертку на bash которая будет прокидывать "$0" в скрипт

Yehor
23.06.2018
13:29:35
хотел читать данные с папки скрипта "красиво"
но даже
println(this.javaClass.protectionDomain.codeSource.location.path)
в kts не работает

Руслан
23.06.2018
13:30:56
Ну это хороший запрос на улучшение, можно в youtrack создать issue
ну либо kotlinc path/script.kts path, но такое, да. В bash можно получить имя файла и путь из env

Quantum Harmonizer
23.06.2018
20:57:08
Есть какой-нибудь способ заставить ProGuard вырезать internal?
Ну или кипнуть только те методы, которые выставлены через интерфейс.

Dibro
23.06.2018
21:13:19

Quantum Harmonizer
23.06.2018
21:13:44

Антон
23.06.2018
21:14:53
Типо клиентский код работает с интерфейсом

Dibro
23.06.2018
21:16:00
а через интернал -- реализация?

Quantum Harmonizer
23.06.2018
21:16:28
да, очень много internal
и хрен сузишь видимость, чтоб прогард понял

Dibro
23.06.2018
21:17:27

Google

Quantum Harmonizer
23.06.2018
21:17:46
это как?

Dibro
23.06.2018
21:18:49
это как?
все паблик интерфейсы в одном модуле, а реализации -- в другом
и первый как зависимость

Quantum Harmonizer
23.06.2018
21:19:10
и как прогардить?

Dibro
23.06.2018
21:19:34
я это вместо прогарда предлагаю

Quantum Harmonizer
23.06.2018
21:20:19
Вообще не понял, зачем.

Dibro
23.06.2018
21:21:08

Quantum Harmonizer
23.06.2018
21:21:27

Dibro
23.06.2018
21:22:07

Quantum Harmonizer
23.06.2018
21:22:23

Dibro
23.06.2018
21:22:32
дошло))