【问题标题】:Facing issue during hot deploy of kar filekar文件热部署时面临的问题
【发布时间】:2018-05-20 11:41:41
【问题描述】:

我的 kar 文件包含以下捆绑包:

a)common-bundle(包含作为 JPA 提供程序的 hibernate)

b)client-bundle(访问 common-bundle 中的 entityManagerFactory 并执行业务逻辑)

在 karaf 容器上执行 kar 文件的热部署时遇到一个奇怪的问题。

如果我尝试进行正常部署(即通过停止 karaf 容器,将 kar 文件放入部署文件夹并重新启动 karaf 容器),两个包都可以正常运行。

但是,当我尝试在 karaf 容器上热部署 kar 文件时,它会抛出以下异常:

Dec 06 13:50:50 INFO 141 HHH000204:处理 PersistenceUnitInfo [ 名称:MyModelClass ...] 12 月 6 日 13:50:51 INFO 141 HHH000130:实例化显式连接提供程序:org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider 12 月 6 日 13:50:51 错误 187 找不到捆绑包 common-bundle/0.0.1.SNAPSHOT 所需的数据源 osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/ds) . javax.naming.NameNotFoundException: osgi:service/javax.sql.DataSource/"(osgi.jndi.service.name=jdbc/ds)" 在 org.apache.aries.jndi.url.ServiceRegistryContext.lookup(ServiceRegistryContext.java:113)[66:org.apache.aries.jndi.url:1.1.0] 在 org.apache.aries.jndi.url.ServiceRegistryContext.lookup(ServiceRegistryContext.java:138)[66:org.apache.aries.jndi.url:1.1.0] 在 org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161)[64:org.apache.aries.jndi.core:1.0.2] 在 javax.naming.InitialContext.lookup(InitialContext.java:417)[:1.8.0_141] 在 org.apache.aries.jpa.container.unit.impl.JndiDataSource.getDs(JndiDataSource.java:66)[187:org.apache.aries.jpa.container:1.0.4] 在 org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource.getConnection(DelayedLookupDataSource.java:36)[187:org.apache.aries.jpa.container:1.0.4] 在 org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70)[213:org.hibernate.entitymanager:4.2.21.Final] 在 org.hibernate.engine.jdbc.internal.JdbcServicesImpl$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcServicesImpl.java:242)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:117)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:85)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:184)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:156)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1827)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1785)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.ejb.EntityManagerFactoryImpl.(EntityManagerFactoryImpl.java:96)[213:org.hibernate.entitymanager:4.2.21.Final] 在 org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915)[213:org.hibernate.entitymanager:4.2.21.Final] 在 org.hibernate.osgi.OsgiPersistenceProvider.createContainerEntityManagerFactory(OsgiPersistenceProvider.java:99)[214:org.hibernate.osgi:4.2.21.Final] 在 org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.createEntityManagerFactories(EntityManagerFactoryManager.java:432)[187:org.apache.aries.jpa.container:1.0.4] 在 org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.registerEntityManagerFactories(EntityManagerFactoryManager.java:292)[187:org.apache.aries.jpa.container:1.0.4] 在 org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.access$000(EntityManagerFactoryManager.java:74)[187:org.apache.aries.jpa.container:1.0.4] 在 org.apache.aries.jpa.container.impl.EntityManagerFactoryManager$1.call(EntityManagerFactoryManager.java:203)[187:org.apache.aries.jpa.container:1.0.4] 在 org.apache.aries.jpa.container.impl.EntityManagerFactoryManager$1.call(EntityManagerFactoryManager.java:199)[187:org.apache.aries.jpa.container:1.0.4] 在 java.util.concurrent.FutureTask.run(FutureTask.java:266)[:1.8.0_141] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)[:1.8.0_141] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)[:1.8.0_141] 在 java.lang.Thread.run(Thread.java:748)[:1.8.0_141] 12 月 6 日 13:50:51 WARN 187 创建 EntityManagerFactory 时出错 java.lang.RuntimeException:找不到捆绑包 common-bundle/0.0.1.SNAPSHOT 所需的数据源 osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/ds)。 在 org.apache.aries.jpa.container.unit.impl.JndiDataSource.getDs(JndiDataSource.java:87)[187:org.apache.aries.jpa.container:1.0.4] 在 org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource.getConnection(DelayedLookupDataSource.java:36)[187:org.apache.aries.jpa.container:1.0.4] 在 org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70)[213:org.hibernate.entitymanager:4.2.21.Final] 在 org.hibernate.engine.jdbc.internal.JdbcServicesImpl$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcServicesImpl.java:242)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:117)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:85)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:184)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:156)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1827)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1785)[212:org.hibernate.core:4.2.21.Final] 在 org.hibernate.ejb.EntityManagerFactoryImpl.(EntityManagerFactoryImpl.java:96)[213:org.hibernate.entitymanager:4.2.21.Final] 在 org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915)[213:org.hibernate.entitymanager:4.2.21.Final] 在 org.hibernate.osgi.OsgiPersistenceProvider.createContainerEntityManagerFactory(OsgiPersistenceProvider.java:99)[214:org.hibernate.osgi:4.2.21.Final] 在 org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.createEntityManagerFactories(EntityManagerFactoryManager.java:432)[187:org.apache.aries.jpa.container:1.0.4] 在 org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.registerEntityManagerFactories(EntityManagerFactoryManager.java:292)[187:org.apache.aries.jpa.container:1.0.4] 在 org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.access$000(EntityManagerFactoryManager.java:74)[187:org.apache.aries.jpa.container:1.0.4] 在 org.apache.aries.jpa.container.impl.EntityManagerFactoryManager$1.call(EntityManagerFactoryManager.java:203)[187:org.apache.aries.jpa.container:1.0.4] 在 org.apache.aries.jpa.container.impl.EntityManagerFactoryManager$1.call(EntityManagerFactoryManager.java:199)[187:org.apache.aries.jpa.container:1.0.4] 在 java.util.concurrent.FutureTask.run(FutureTask.java:266)[:1.8.0_141] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)[:1.8.0_141] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)[:1.8.0_141] 在 java.lang.Thread.run(Thread.java:748)[:1.8.0_141] 引起:javax.naming.NameNotFoundException: osgi:service/javax.sql.DataSource/"(osgi.jndi.service.name=jdbc/ds)" 在 org.apache.aries.jndi.url.ServiceRegistryContext.lookup(ServiceRegistryContext.java:113)[66:org.apache.aries.jndi.url:1.1.0] 在 org.apache.aries.jndi.url.ServiceRegistryContext.lookup(ServiceRegistryContext.java:138)[66:org.apache.aries.jndi.url:1.1.0] 在 org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161)[64:org.apache.aries.jndi.core:1.0.2] 在 javax.naming.InitialContext.lookup(InitialContext.java:417)[:1.8.0_141] 在 org.apache.aries.jpa.container.unit.impl.JndiDataSource.getDs(JndiDataSource.java:66)[187:org.apache.aries.jpa.container:1.0.4] ... 21 更多 12 月 6 日 13:50:51 INFO 141 HHH000204:处理 PersistenceUnitInfo [ 名称:MyModelClass ...] 12 月 6 日 13:50:52 INFO 141 HHH000130:实例化显式连接提供程序:org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider 12 月 6 日 13:50:55 INFO 141 HHH000400:使用方言:org.hibernate.dialect.Oracle10gDialect 12 月 6 日 13:50:55 INFO 141 HHH000268:事务策略:org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory 12 月 6 日 13:50:55 INFO 141 HHH000397:使用 ASTQueryTranslatorFactory 12 月 6 日 13:50:56 WARN 141 HHH000008:JTASessionContext 与 JDBCTransactionFactory 一起使用;使用 getCurrentSession() 自动刷新将无法正常运行

以下是捆绑包中最重要的内容:

通用捆绑包:

Persistence.xml:

<persistence version="2.0"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/persistence">

<persistence-unit name="my-persistent-unit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/ds)</non-jta-data-source>
    <class>MyModelClass</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
</persistence-unit>

blueprint.xml:

<cm:property-placeholder persistent-id='my-persistent-id'
                         update-strategy='reload'
                         placeholder-prefix="${"
                         placeholder-suffix="}">
    <cm:default-properties>
        <cm:property name="driver" value="undefined"/>
        <cm:property name="url" value="undefined"/>
        <cm:property name="username" value="undefined"/>
        <cm:property name="password" value="undefined"/>
    </cm:default-properties>
</cm:property-placeholder>

<jasypt:property-placeholder encryptor-ref="encryptor"/>
<reference id="encryptor" interface="org.jasypt.encryption.StringEncryptor" availability="mandatory"/>

<bean id='myDs'
      class="CustomConnection">
    <property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/>
    <property name="URL" value="${url}"/>
    <property name="user" value="${username}"/>
    <property name="password" value="${password}"/>
    <property name="validateConnectionOnBorrow" value="true"/>
</bean>

<service ref='myDs' interface='javax.sql.DataSource'>
    <service-properties>
        <entry key='osgi.jndi.service.name' value='jdbc/ds'/>
    </service-properties>
</service>

客户端捆绑包:

blueprint.xml

<bean id="myController"
      class="MyController">
    <argument ref="entityManagerFactory"/>
</bean>
<reference id="entityManagerFactory"
           interface="javax.persistence.EntityManagerFactory"
           filter="(osgi.unit.name=my-persistent-unit)"
           availability="mandatory"/>

请帮忙。

【问题讨论】:

    标签: java hibernate jpa osgi blueprint-osgi


    【解决方案1】:

    显然每个包都在使用数据源,但没有人创建它。

    javax.naming.NameNotFoundException: osgi:service/javax.sql.DataSource/"(osgi.jndi.service.name=jdbc/ds)"

    您需要创建此数据源,例如将一个简单的 XML 文件放入部署目录:

    <?xml version="1.0" encoding="UTF-8"?>
    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
    
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="org.postgresql.Driver" />
            <property name="url" value="jdbc:postgresql://localhost:5432/yourdb"/>
            <property name="username" value="XXX"/>
            <property name="password" value="XXX"/>
        </bean>
    
        <service interface="javax.sql.DataSource" ref="dataSource">
            <service-properties>
                <entry key="osgi.jndi.service.name" value="jdbc/ds"/>
            </service-properties>
        </service>
    </blueprint>
    

    您需要安装 jdbcjndi 功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      相关资源
      最近更新 更多