В моей библиотеке по конструированию Telegram ботов при переходе на Quarkus 3 возникала проблема.
Проблема возникает при вызове метода в библиотеке телеграма AbsSender.executeAsync()
. Судя по всему сессии БД зависают и не освобождаются, из-за чего пул сессий заканчивается и возникает следующее исключение:
Проблема в том, что в DefaultAbsSender
есть поле protected final ExecutorService exe
, который используется в AbsSender.executeAsync()
. Этот ExecutorService
никак не изменить, в конструктор не передать, сеттера нет, да и поле final
.
Эта особенность приводит к тому, что при использовании вызовов телеграм в контексте работы с Hibernate Reactive мы получаем ситуацию, в которой поток меняется. Hibernate Reactive в свою очередь требует, чтобы вся работа выполнялась в рамках одного и того же потока из-за особенностей управления сессиями и транзакциями.
В документации четко сказано: “Сеанс не является потокобезопасным (или “потокобезопасным”), поэтому его использование в разных потоках (или реактивных потоках) может привести к ошибкам, которые крайне трудно обнаружить. Не говорите, что мы вас не предупреждали!”
Решением данной ситуации для своей библиотеки я нашел в следующем. У меня есть TelegramPollingBot
, который является наследником DefaultAbsSender
, поэтому в конструкторе я получаю доступ к final
полю через рефлексию, далее делаю его изменяемым и устанавливаю ExecutorService
.
Мета информация
Область:: 00 Снипеты для Java
Родитель::
Источник::
Создана:: 2024-09-11
Автор::