
Dim
04.07.2018
11:41:38
ага, одной аннотацией с ноги

Таир
04.07.2018
11:41:46

Глеб
04.07.2018
11:41:53
спасибо

Google

Таир
04.07.2018
11:43:34

Глеб
04.07.2018
11:43:52
не успею, проекту уже несколько лет)

Таир
04.07.2018
11:44:38

Vyacheslav
04.07.2018
11:54:38
кстати, ломбок для Java >=9 уже работает?

Artem
04.07.2018
11:56:44
для 9 работает, проверял

Митко Соловец?
04.07.2018
11:57:51
давно уже

Mikhail
04.07.2018
11:58:01
короче, никакого бага нет
просто Apache FOP так написан
что подгружает шрифт в память на каждую генерацию
круто, чо

Friedrich
04.07.2018
11:59:03

Vyacheslav
04.07.2018
11:59:05
форкни, перепиши, сделай пулл-реквест

Google

Vyacheslav
04.07.2018
11:59:26
я для Excel reader-а делал

Mikhail
04.07.2018
11:59:47
и кэш тут не при чем - кэш помогает ему знать, какие файлы надо грузить, если он сканит системные шрифты или папку. В случае, когда конкретный шрифт - кэш бесполезен.
мммм
мысль интересная, конечно

Tolegen
04.07.2018
12:00:53
Fop это те ещё приключения. Проще купить iPdf или как там его
Дешевле выйдет по итогу

Mikhail
04.07.2018
12:01:27
там фишка в том, что сам объект fop надо создавать каждый раз заново - это написано в документации
у нас ситуация специфичная - в реальной системе этот функционал сейчас не используется, а начали падать тесты - выросло количество мест, где неявно вызывается код с генерацией pdf
и тупо gc не успевает память чистить от этого шрифта между тестами
и на очередном тесте - все падает
поэтому счас просто закомментировал эту ветку в коде, чтобы на тесты это не влияло
а если понадобится для прода - надо будет переписывать в итоге

Friedrich
04.07.2018
12:05:35

Mikhail
04.07.2018
12:07:30
Высококонкурентные тесты или утечка?
Получается, что утечка - каждый тест из группы в итоге доходит до генерации pdf (теоретически может уходить на имейл юзеру, реально этого нет) - и грузится шрифт в память, по 22 метра на каждый тест.
Вот и всё - в какой-то момент gc только и делает, что память от старых экземпляров шрифта чистит, в то время, как там новые напирают

Friedrich
04.07.2018
12:09:27
А, ок, то есть не совсем утечка, а просто GC не успевает. Ну что ж, надо чинить!

Oleksandr
04.07.2018
12:09:56

Mikhail
04.07.2018
12:14:38
может, надо лениво генерить?
Вытянуть их все в очередь и генерить себе один за одним - это всё правильное решение, если этот функционал будет на проде + большая нагрузка
Получается, что в тестах у нас косвенно получилась штука, которой в реальности вообще не бывает))))

Google

Vladimir
04.07.2018
12:17:10
Грузить 22 метра в память на каждый запрос - всё равно так себе. Производительность пока устраивает?

Oleksandr
04.07.2018
12:18:43

Mikhail
04.07.2018
12:18:51
ну в общем да
если это добавится в прод - надо будет в фон выносить даже не пдф-ы
а вообще формирование писем
сейчас мы это делаем immediately, так как это только на этапе регистрации, которую даже не пользователь, а специальный техник проводит

Oleksandr
04.07.2018
12:20:44
ну вот, такой косяк удачно обнаружили благодаря тестам

Mikhail
04.07.2018
12:20:50
а если добавляем pdf во вложение - то тогда очередь генерации писем, и как следствие - pdf -ов

Friedrich
04.07.2018
12:21:16

Oleksandr
04.07.2018
12:21:53

Oleksandr
04.07.2018
12:22:05
но это не важно для такой задачи

Mikhail
04.07.2018
12:22:19

Friedrich
04.07.2018
12:23:04
Ну ладно тогда.

Владислав
04.07.2018
12:33:32
друзья, играюсь с сервлетами и проблема появилась
когда через idea деплою, она зачищает папку root, ставит проект туда и только так запускается(причём, по нормальному uri, будто он в другой папке, если обращаюсь по /, то не работает). Грешу на Guice, возможно, что-то не так настроил
а если через tomcat-manager(создает отдельную директорию), то в логах всё ок, но запускаться не хочет
проблема была в парсинге uri, разобрался, спасибо
кто-нибудь знает, можно ли как-то сделать, чтоб когда на сервлете выполняется doPost, к примеру, resp не сразу отправлялся?

Google

Sergey
04.07.2018
14:46:47
Thread.sleep

Владислав
04.07.2018
14:48:56
а если мне самому нужно указать, когда вернуть resp? не дописал вопрос, прошу прощения

Artem
04.07.2018
14:48:59

Sergey
04.07.2018
14:49:53
Ну а кто тебе мешает из реквеста получить и передать аргумент в тред.слип?

Admin
ERROR: S client not available

Alexandr
04.07.2018
14:50:12
Еще в сторону asynсContext можно посмотреть

Владислав
04.07.2018
14:51:00

Sergey
04.07.2018
14:51:36
Лучше ты скажи, как ты хочешь сказать сервлету сколько ждать перед респонсом?
Передать через урл можно /url?wait=1000

Владислав
04.07.2018
14:52:21
пока не выполнится запрос к бд

Sergey
04.07.2018
14:52:41
Но у тебя же заблочится и так тред
Запросом

Владислав
04.07.2018
14:52:47
нет

Alexey
04.07.2018
14:53:24

Sergey
04.07.2018
14:53:49
Нормальный совет, обычный. Как вопрос - такой ответ

Владислав
04.07.2018
14:53:51
https://gist.github.com/eltgm/034a678fd4bb2e1f00d2af244a1bd8f7 вот ситуация
addTransaction выполнился, ответ ушёл
а бд ответ ещё не успевает вернуть ответ

Sergey
04.07.2018
14:54:16
Наконец-то, у тебя коллбеки
Я не знаю апи с которым ты работаешь, получи транзакцию и залочь ею тред
АддТранзакшен должен что то возвращать
Типа как у Future.get

Google

Sergey
04.07.2018
14:56:24
Ты пытаешься респонс кинуть в лямбде, так по-моему не будет работать

Владислав
04.07.2018
14:56:31
те, никак нельзя заставить resp дождаться колбэка?
да всё работает
просто у меня resp отправляется раньше, чем приходит ответ
причём, при втором вызове всё нормально
потом опять не успевает
потом опять нормально
неужели это нельзя никак контроллировать ?

Tolegen
04.07.2018
15:13:35
Ответ надо асинхронно отдавать
Иначе смысла нет в неблокирующей БД

Владислав
04.07.2018
15:14:15
она и даёт асинхронно
сервлет не дает ответ асинхронно

Tolegen
04.07.2018
15:14:50
Сервлеты вроде поддерживают асинхрон с какой-то версии (3.0+)
Или перейти на WebFlux

Alexandr
04.07.2018
15:17:08
Обсуждение более подходит для https://t.me/javastart, @eltgm, присоединяйся. А по вопросу - смотри в сторону асинхронных сервлетов.

Artem
04.07.2018
18:59:56
Всем привет . Подскажите пожалуйста если я использую AtomocReference.compareAndSet и два потока пытаются выполнить этот метод то гарантируется ли что второй поток дождется пока первый выполнить операцию, увидит измения первого и только тогда выполнить метод ?

Vladimir
04.07.2018
19:00:51