From f5fdace7b4b061fd43606262cf9d64384d011796 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Wed, 11 Sep 2024 12:49:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D0=B0=20=D1=81=20Hibernate=20Reactive=20=D0=B2=20Telegram=20SD?= =?UTF-8?q?K=20=D0=B4=D0=BB=D1=8F=20Java.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/java/Java Reflection.md | 22 +++++++++ dev/java/gc/Garbage Collector.md | 2 +- ...а с Hibernate Reactive в Telegram SDK для Java.md | 45 +++++++++++++++++++ index.md | 2 +- meta/zero/00 Hibernate Reactive.md | 14 ++++++ meta/zero/00 Hibernate.md | 4 +- meta/zero/00 HighLoad.md | 6 +-- meta/zero/00 Java разработка.md | 1 + meta/zero/00 Снипеты для Java.md | 3 +- 9 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 dev/java/Java Reflection.md create mode 100644 dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java.md create mode 100644 meta/zero/00 Hibernate Reactive.md diff --git a/dev/java/Java Reflection.md b/dev/java/Java Reflection.md new file mode 100644 index 00000000..495a8f54 --- /dev/null +++ b/dev/java/Java Reflection.md @@ -0,0 +1,22 @@ +--- +aliases: + - рефлексию + - рефлексия +tags: + - maturity/🌱 +date: 2024-09-11 +zero-link: + - "[[00 Java разработка]]" +parents: +linked: +--- + +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-09-11]] +**Автор**:: +### Дополнительные материалы +- \ No newline at end of file diff --git a/dev/java/gc/Garbage Collector.md b/dev/java/gc/Garbage Collector.md index 2f227625..b143e56a 100644 --- a/dev/java/gc/Garbage Collector.md +++ b/dev/java/gc/Garbage Collector.md @@ -36,7 +36,7 @@ B следующие недостатки: > Дай мне места для размещения того, что пока еще нужно. Дай мне смелости удалить то, что больше не пригодится. И дай мне мудрости, чтобы отличить одно от другого. ## Производительность GC Вам быстро, дешево или качественно? -- **Throughput.** Объем вычислительных ресурсов CPU, затрачиваемых на работу GC. +- [[../../architecture/Throughput|Throughput]]. Объем вычислительных ресурсов CPU, затрачиваемых на работу GC. - **Предсказуемость.** На какое время прерывается работа приложения. - **Footprint.** Объем используемой памяти. ## Работа GC diff --git a/dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java.md b/dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java.md new file mode 100644 index 00000000..ecf78617 --- /dev/null +++ b/dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java.md @@ -0,0 +1,45 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-09-11 +zero-link: + - "[[../../meta/zero/00 Java разработка|00 Java разработка]]" +parents: +linked: +--- +В [моей библиотеке по конструированию Telegram ботов](https://git.struchkov.dev/Godfather-Bots/telegram-bot) при переходе на [[../../meta/zero/00 Quarkus|Quarkus 3]] возникала проблема. + +Проблема возникает при вызове метода в [библиотеке телеграма](https://mvnrepository.com/artifact/org.telegram/telegrambots) `AbsSender.executeAsync()`. Судя по всему сессии БД зависают и не освобождаются, из-за чего пул сессий заканчивается и возникает следующее исключение: + +```shell +024-09-11 11:25:05,060 ERROR [io.qua.arc.imp.AbstractInstanceHandle] (pool-12-thread-1) Error occurred while destroying instance of bean [io.quarkus.hibernate.reactive.runtime.ReactiveSessionProducer_ProducerMethod_createMutinySession_1321d110ee9e92bda147899150401e0a136779c7_Bean]: java.util.concurrent.CompletionException: java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than the one which was used to open the reactive Session - this suggests an invalid integration; original thread [186]: 'vert.x-eventloop-thread-5' current Thread [189]: 'vert.x-eventloop-thread-6' +``` + +Проблема в том, что в `DefaultAbsSender` есть поле `protected final ExecutorService exe`, который используется в `AbsSender.executeAsync()`. Этот `ExecutorService` никак не изменить, в конструктор не передать, сеттера нет, да и поле `final`. + +Эта особенность приводит к тому, что при использовании вызовов телеграм в контексте работы с [[../../meta/zero/00 Hibernate Reactive|Hibernate Reactive]] мы получаем ситуацию, в которой [[../fundamental/Поток процесса ОС|поток]] меняется. [[../../meta/zero/00 Hibernate Reactive|Hibernate Reactive]] в свою очередь требует, чтобы вся работа выполнялась в рамках одного и того же [[../fundamental/Поток процесса ОС|потока]] из-за особенностей управления сессиями и транзакциями. + +> В [документации](https://hibernate.org/reactive/documentation/2.0/reference/html_single/#_sessions_and_vert_x_contexts) четко сказано: "Сеанс не является потокобезопасным (или "потокобезопасным"), поэтому его использование в разных потоках (или реактивных потоках) может привести к ошибкам, которые крайне трудно обнаружить. Не говорите, что мы вас не предупреждали!" + +Решением данной ситуации для своей библиотеки я нашел в следующем. У меня есть `TelegramPollingBot`, который является наследником `DefaultAbsSender`, поэтому в конструкторе я получаю доступ к `final` полю через [[../java/Java Reflection|рефлексию]], далее делаю его изменяемым и устанавливаю `ExecutorService`. + +```java +final Field field = this.getClass().getSuperclass().getSuperclass().getDeclaredField("exe"); +// Делаем поле exe доступным для изменений +field.setAccessible(true); +// Заменяем поле exe в экземпляре наследника +field.set(this, Infrastructure.getDefaultWorkerPool()); +// Закрываем доступ к полю exe +field.setAccessible(false); +``` + +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-09-11]] +**Автор**:: +### Дополнительные материалы +- [Parallel execution: A Hibernate Reactive Gotcha](https://blog.lunatech.com/posts/2023-05-19-hibernate-reactive-gotchas) \ No newline at end of file diff --git a/index.md b/index.md index 68777538..a05938d2 100644 --- a/index.md +++ b/index.md @@ -36,7 +36,7 @@ enableToc: false - [Java разработка](meta/zero/00%20Java%20разработка.md) - [Quarkus](meta/zero/00%20Quarkus.md) - [SpringBoot](meta/zero/00%20SpringBoot.md) - - [00 Hibernate](meta/zero/00%20Hibernate.md) + - [Hibernate](meta/zero/00%20Hibernate.md) / [[meta/zero/00 Hibernate Reactive|Hibernate Reactive]] - Архитектура - [[meta/zero/00 Архитектура ЭВМ|Архитектура ЭВМ]] - [Архитектура ПО](meta/zero/00%20Архитектура%20ПО.md) diff --git a/meta/zero/00 Hibernate Reactive.md b/meta/zero/00 Hibernate Reactive.md new file mode 100644 index 00000000..0ebe6fd8 --- /dev/null +++ b/meta/zero/00 Hibernate Reactive.md @@ -0,0 +1,14 @@ +--- +aliases: + - Hibernate Reactive +tags: + - type/zero-link +zero-link: + - "[[00 Hibernate|00 Hibernate]]" +parents: +linked: +title: Hibernate Reactive +--- +- [[../../dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java|Проблема с Hibernate Reactive в Telegram SDK для Java]] + +В [документации](https://hibernate.org/reactive/documentation/2.0/reference/html_single/#_sessions_and_vert_x_contexts) сказано: "Сеанс не является потокобезопасным (или "потокобезопасным"), поэтому его использование в разных потоках (или реактивных потоках) может привести к ошибкам, которые крайне трудно обнаружить. Не говорите, что мы вас не предупреждали!" \ No newline at end of file diff --git a/meta/zero/00 Hibernate.md b/meta/zero/00 Hibernate.md index 689f67d0..0a1d0f02 100644 --- a/meta/zero/00 Hibernate.md +++ b/meta/zero/00 Hibernate.md @@ -6,4 +6,6 @@ tags: title: Hibernate --- - [Дублирование значений при использовании @ElementCollection и @OneToMany](../../dev/java/hibernate/Дублирование%20значений%20при%20использовании%20@ElementCollection%20и%20@OneToMany.md) -- [Логирование SQL в Hibernate](../../dev/java/hibernate/Логирование%20SQL%20в%20Hibernate.md) \ No newline at end of file +- [Логирование SQL в Hibernate](../../dev/java/hibernate/Логирование%20SQL%20в%20Hibernate.md) + +- [[00 Hibernate Reactive|Hibernate Reactive]] \ No newline at end of file diff --git a/meta/zero/00 HighLoad.md b/meta/zero/00 HighLoad.md index edee12fe..fc0b1f9d 100644 --- a/meta/zero/00 HighLoad.md +++ b/meta/zero/00 HighLoad.md @@ -36,7 +36,7 @@ aliases: - Асинхронная обработка - Конвейерная обработка - Использование толстого клиента -- [Кэширование](Кэширование.md) +- [Кэширование](../../dev/architecture/Кэширование.md) - [Функциональное разделение](Функциональное%20разделение.md) - [Шардинг](Шардирование%20в%20БД.md) - Виртуальные шарды @@ -74,6 +74,6 @@ aliases: - [Reliability](Reliability.md) - [Disaster recovery](Disaster%20recovery.md) -[Пропускная способность](Throughput.md) сетевой карты 1 Гбит/с (реальная 800-900 Мбит/с) или 120 000 пакетов в секунду. Bonding позволяет несколько физических интернет соединений объединить в одно логическое, например, 4 интерфейса - 3.5 Гбит/с. +[Пропускная способность](../../dev/architecture/Throughput.md) сетевой карты 1 Гбит/с (реальная 800-900 Мбит/с) или 120 000 пакетов в секунду. Bonding позволяет несколько физических интернет соединений объединить в одно логическое, например, 4 интерфейса - 3.5 Гбит/с. -В highload системах как правило отдают предпочтение [throughput](Throughput.md). \ No newline at end of file +В highload системах как правило отдают предпочтение [throughput](../../dev/architecture/Throughput.md). \ No newline at end of file diff --git a/meta/zero/00 Java разработка.md b/meta/zero/00 Java разработка.md index 945b164d..6c286d63 100644 --- a/meta/zero/00 Java разработка.md +++ b/meta/zero/00 Java разработка.md @@ -8,6 +8,7 @@ title: Java разработка --- - [Устройство Java](Устройство%20Java.md) - [JDK](../../dev/java/JDK.md) + - [[../../dev/java/Java Reflection|Java Reflection]] - [Снипеты для Java](00%20Снипеты%20для%20Java.md) - Системы сборки - [Maven](00%20Maven.md) diff --git a/meta/zero/00 Снипеты для Java.md b/meta/zero/00 Снипеты для Java.md index 95c9e4d7..34e226cd 100644 --- a/meta/zero/00 Снипеты для Java.md +++ b/meta/zero/00 Снипеты для Java.md @@ -14,4 +14,5 @@ aliases: - [Несколько подключений к базе H2](../../dev/snippet/Несколько%20подключений%20к%20базе%20H2.md) - [Дебаг приложения на этапе компиляции IntelliJ IDEA](../../dev/snippet/Дебаг%20приложения%20на%20этапе%20компиляции%20IntelliJ%20IDEA.md) - [Логирование SQL в Hibernate](../../dev/java/hibernate/Логирование%20SQL%20в%20Hibernate.md) -- [Бинарный поиск на Java](../../dev/java/Бинарный%20поиск%20на%20Java.md) \ No newline at end of file +- [Бинарный поиск на Java](../../dev/java/Бинарный%20поиск%20на%20Java.md) +- [[../../dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java|Проблема с Hibernate Reactive в Telegram SDK для Java]] \ No newline at end of file