Проблема с Hibernate Reactive в Telegram SDK для Java.md
This commit is contained in:
parent
86d274de15
commit
f5fdace7b4
22
dev/java/Java Reflection.md
Normal file
22
dev/java/Java Reflection.md
Normal file
@ -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]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
@ -36,7 +36,7 @@ B следующие недостатки:
|
||||
> Дай мне места для размещения того, что пока еще нужно. Дай мне смелости удалить то, что больше не пригодится. И дай мне мудрости, чтобы отличить одно от другого.
|
||||
## Производительность GC
|
||||
Вам быстро, дешево или качественно?
|
||||
- **Throughput.** Объем вычислительных ресурсов CPU, затрачиваемых на работу GC.
|
||||
- [[../../architecture/Throughput|Throughput]]. Объем вычислительных ресурсов CPU, затрачиваемых на работу GC.
|
||||
- **Предсказуемость.** На какое время прерывается работа приложения.
|
||||
- **Footprint.** Объем используемой памяти.
|
||||
## Работа GC
|
||||
|
@ -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)
|
2
index.md
2
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)
|
||||
|
14
meta/zero/00 Hibernate Reactive.md
Normal file
14
meta/zero/00 Hibernate Reactive.md
Normal file
@ -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) сказано: "Сеанс не является потокобезопасным (или "потокобезопасным"), поэтому его использование в разных потоках (или реактивных потоках) может привести к ошибкам, которые крайне трудно обнаружить. Не говорите, что мы вас не предупреждали!"
|
@ -7,3 +7,5 @@ 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)
|
||||
|
||||
- [[00 Hibernate Reactive|Hibernate Reactive]]
|
@ -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).
|
||||
В highload системах как правило отдают предпочтение [throughput](../../dev/architecture/Throughput.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)
|
||||
|
@ -15,3 +15,4 @@ aliases:
|
||||
- [Дебаг приложения на этапе компиляции 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)
|
||||
- [[../../dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java|Проблема с Hibernate Reactive в Telegram SDK для Java]]
|
Loading…
Reference in New Issue
Block a user