Убедитесь, что приложение развертывается, даже если источник данных неисправен - PullRequest
0 голосов
/ 30 апреля 2019

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

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

Пример:

persistance.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;

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

1 Ответ

3 голосов
/ 01 мая 2019

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

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

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

Если вы хотите, чтобы ваше приложение запускалось без доступного источника данных, то я думаю, что вам нужно самостоятельно загрузить 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

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

...