即使数据源出现故障,也要确保应用程序已部署

时间:2019-04-30 06:23:37

标签: java-ee ejb wildfly cdi

是否有一种模式可以确保即使数据源出现故障,也可以部署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 个答案:

答案 0 :(得分:3)

希望我能正确理解您的问题。

如果JEE Server引导了EntityManagerFactory,并且没有可用的数据源,但是在persistence.xml中引用了该数据源,则它将失败,这是可以预期的,因为无法解决依赖关系。

如果EntityManagerFactory的创建失败,则该应用程序无法启动,因为它是引导过程的一部分。据我所知,如果持久性引导失败,则无法强制执行惰性持久性引导或重试。这将是一个有用的行为,但是这种方法是微服务体系结构提出的,并且在当时还没有被普通的JEE服务器实现。

如果您想在没有可用数据源的情况下启动应用程序,那么我认为您需要自己引导EntityManagerFactory,这样您就可以捕获错误,并在下次尝试注入EntityManager时进行尝试。使用这种方法,您将必须自己以及CDI注入的生产者自己管理EntityManagerFactory和EntityManager生命周期。然后,无法通过@PersistenceUnit进行注入。

链接

Getting a reference to EntityManager in Java EE applications using CDI

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

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

也许您提供了在引导过程中获得的错误日志。