Короче говоря: Насколько мне известно, нет способа решить это строго в рамках CDI без дополнительных усилий. Вот некоторые общие c мысли:
Эта проблема похожа на что из пула соединений с БД. Один из способов решить эту проблему - использовать пул Engine
экземпляров, из которого EngineManager
(s) выбирают.
Немного проработав, и если вы используете пул двигателей, EngineManager
может быть @ApplicationScoped
, поскольку пул гарантирует, что каждый поток получает разные Engine
.
Интересный аспект этого заключается в том, как вы справляетесь с недоступностью Engine
экземпляров. Вызов исключения - самый простой ответ, но он может не подходить для вашего случая использования. Блокировка текущего потока (возможно, с тайм-аутом) до тех пор, пока Engine
не станет доступным, является еще одним неоптимальным решением, поскольку он не будет хорошо масштабироваться под traffi c.
Если ваша среда позволяет, вы можете захотеть рассмотрим асинхронное решение в сочетании с пулом. ExecutorService
(см. ManagedExecutorService
в средах JEE), где вы отправляете задачи; JMS или другой механизм организации очередей может быть более сложным в настройке (опять же, в зависимости от вашей среды), но может обеспечить надежность в виде сохранения сообщений (если сервер падает после отправки работы, но до получения результата, он может возобновить и завершить работать, когда он возвращается онлайн). Полное асинхронное c требует больше усилий, но может быть более уместным, если ваш конкретный c вариант использования оправдывает его.
Реакции на комментарии:
- EJB - это естественные способ для таких случаев использования в традиционных приложениях JEE. Вы будете использовать возможности, предоставляемые сервером приложений. (Мой инстинкт заключается в том, чтобы в настоящее время держаться подальше от EJB ... просто говорю)
- Вы находитесь на Quarkus (хорошая IMO). Если вы go для очереди, вам придется настроить другую систему - вы можете судить, стоит ли это того. Quarkus поддерживает асинхронное выполнение во многих отношениях (и вы даже можете попробовать решения с реактивными потоками).
- Я не знал о упомянутой библиотеке omniservices. Это может удовлетворить ваши потребности, , но требует преобразования в расширение Quarkus , так как Quarkus в настоящее время не поддерживает переносимые расширения CDI , к сожалению.