Убедитесь, что приложение развертывается, даже если источник данных неисправен

Есть ли шаблон, чтобы убедиться, что приложение java ee развертывается, даже если источник данных неисправен? Мое приложение не запускается, если источник данных недоступен. Менеджер сущностей не может быть инициализирован и поэтому не может быть внедрен в мой ejb. Это приводит к сбою всего развертывания.

Приложение имеет DLQ, когда источник данных недоступен.

Пример:

постоянство.xml

<persistence-unit name = "dataSourceExample" transaction-type = "JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jboss/datasources/dataSourceExample</jta-data-source>        
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name = "hibernate.dialect" value = "org.hibernate.dialect.Oracle10gDialect"/>
        <property name = "hibernate.show_sql" value = "false"/>
        <property name = "hibernate.generate_statistics" value = "false"/>
    </properties>
</persistence-unit>

конфигурация источника данных в wildfly

<datasource jndi-name = "java:jboss/datasources/dataSourceExample" pool-name = "dataSourceExamplePool" use-ccm = "false">
    <connection-url>someurl</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <driver>com.oracle.ojdbc</driver>
    <pool>
        <max-pool-size>25</max-pool-size>
    </pool>
    <security>
        <user-name>someusername</user-name>
        <password>somepassword</password>
    </security>
    <validation>
        <valid-connection-checker class-name = "org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
        <stale-connection-checker class-name = "org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
        <exception-sorter class-name = "org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
    </validation>
    <timeout>
        <blocking-timeout-millis>5000</blocking-timeout-millis>
    </timeout>
    <statement>
        <share-prepared-statements>false</share-prepared-statements>
    </statement>
</datasource>

Внедренный менеджер сущностей в ejb

@PersistenceContext(unitName = "dataSourceExample")
private EntityManager dataSourceExampleEm;

Я просто хочу, чтобы приложение было развернуто, даже если оно не полностью функционально. Это сработает позже, когда источник данных «вернется».

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Надеюсь, я правильно понял ваш вопрос.

Если сервер JEE загружает EntityManagerFactory и нет доступного источника данных, но он указан в файле persistence.xml, произойдет сбой, чего и следовало ожидать, поскольку зависимость не может быть разрешена.

Если создать EntityManagerFactory не удается, приложение нельзя запустить, поскольку оно является частью процесса начальной загрузки. Насколько я знаю, нет способа принудительно выполнить загрузку с ленивой постоянством или повторить попытку, если загрузка с сохранением не удалась. Это было бы полезным поведением, но этот подход появился в архитектуре микросервисов и не был реализован на обычных серверах JEE в тот день.

Если вы хотите, чтобы ваше приложение запускалось без доступного DataSource, то, я думаю, вам нужно самостоятельно загрузить EntityManagerFactory, благодаря чему вы сможете отлавливать ошибки и пробовать их при следующей попытке внедрения EntityManager. При таком подходе вам придется самостоятельно управлять жизненным циклом EntityManagerFactory и EntityManager, а также производителями для внедрения CDI. Тогда инъекция через @PersistenceUnit работать не будет.

Ссылки

Получение ссылки на EntityManager в приложениях Java EE с помощью CDI

https://www.sitepoint.com/cdi-weld-inject-jpa-hibernate-entity-managers/

https://deltaspike.apache.org/documentation/jpa.html

Возможно, вы предоставляете журналы ошибок, которые вы получаете во время начальной загрузки.

Другие вопросы по теме