conectando-se ao PostgreSQL a partir do aplicativo OSGi implantado no contêiner Karaf
-
26-12-2019 - |
Pergunta
Estou usando o Hibernate para conectar-me ao PostgreSQL a partir de um contêiner Karaf 2.3.4. Quando implanto meu pacote, há uma exceção dizendo javax.naming.NameNotFoundException osgi:service/javax.sql.DataSource/"(osgi.jndi.service. nome=jdbc/postgresds).
Aqui está meu arquivo persistance.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
<persistence-unit name="HibernateOSGi_ContainerManaged"
transaction-type="JTA">
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/postgresds)</jta-data-source>
<class>org.hibernate.osgitest.entity.DataPoint</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
Aqui está meu arquivo blueprint.xml:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint default-activation="eager"
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0" xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0">
<bean id="dpService" class="org.hibernate.osgitest.DataPointServiceImpl">
<jpa:context unitname="HibernateOSGi_ContainerManaged" property="entityManager" />
<tx:transaction method="*" value="Required" />
</bean>
<service ref="dpService" interface="org.hibernate.osgitest.DataPointService" />
<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
<command name="dp/add">
<action class="org.hibernate.osgitest.command.AddCommand">
<property name="dpService" ref="dpService" />
</action>
</command>
<command name="dp/getAll">
<action class="org.hibernate.osgitest.command.GetAllCommand">
<property name="dpService" ref="dpService" />
</action>
</command>
<command name="dp/deleteAll">
<action class="org.hibernate.osgitest.command.DeleteAllCommand">
<property name="dpService" ref="dpService" />
</action>
</command>
</command-bundle>
</blueprint>
E aqui está meu arquivo datasource-postgres.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Install the driver in Karaf. As it is no bundle we use the wrap protocol to create a suitable Manifest on the fly:
> install -s wrap:mvn:postgresql/postgresql/9.1-901.jdbc4
As a last step copy this file to the deploy folder
-->
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="dataSource" class="org.postgresql.ds.PGPoolingDataSource" destroy-method="close">
<property name="serverName" value="localhost:5432/postgres" />
<property name="user" value="postgres" />
<property name="password" value="159357123" />
<property name="dataSourceName" value="postgresds" />
</bean>
<service interface="javax.sql.DataSource" ref="dataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/postgresds" />
</service-properties>
</service>
</blueprint>
E aqui está meu features.xml:
<?xml version="1.0" encoding="UTF-8"?>
<features>
<feature name="hibernate-test">
<feature>karaf-framework</feature>
<!-- JTA -->
<config name="org.apache.aries.transaction">
aries.transaction.recoverable = true
aries.transaction.timeout = 600
aries.transaction.howl.logFileDir =
${karaf.data}/txlog
aries.transaction.howl.maxLogFiles = 2
aries.transaction.howl.maxBlocksPerFile = 512
aries.transaction.howl.bufferSizeKBytes = 4
</config>
<bundle start-level="30">mvn:org.apache.geronimo.specs/geronimo-jta_1.1_spec/1.1.1
</bundle>
<bundle start-level="30">mvn:org.apache.aries.transaction/org.apache.aries.transaction.blueprint/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.transaction/org.apache.aries.transaction.manager/1.0.1
</bundle>
<!-- JPA -->
<!-- <bundle start-level="30">mvn:org.hibernate.javax.persistence/hibernate-jpa-2.1-api/1.0.0-SNAPSHOT</bundle> -->
<bundle start-level="30">mvn:org.apache.geronimo.specs/geronimo-jpa_2.0_spec/1.1
</bundle>
<bundle start-level="30">mvn:org.apache.aries/org.apache.aries.util/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.api/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.blueprint.aries/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.container/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.container.context/1.0.1
</bundle>
<!-- JNDI -->
<bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.api/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.core/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.rmi/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.url/1.0.0
</bundle>
<bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.legacy.support/1.0.0
</bundle>
<feature>jdbc</feature>
<!-- Taken from Karaf-Tutorial -->
<bundle>mvn:org.hibernate.common/com.springsource.org.hibernate.annotations.common/4.1.0.Final</bundle>
<bundle>mvn:commons-collections/commons-collections/3.2.1</bundle>
<bundle>mvn:commons-pool/commons-pool/1.5.4</bundle>
<bundle>mvn:commons-dbcp/commons-dbcp/1.4</bundle>
<bundle>mvn:commons-lang/commons-lang/2.6</bundle>
<bundle>wrap:mvn:net.sourceforge.serp/serp/1.13.1</bundle>
<!-- These do not natively support OSGi, so using 3rd party bundles. -->
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.antlr/2.7.7_5
</bundle>
<bundle>mvn:org.jboss.javassist/com.springsource.javassist/3.15.0.GA
</bundle>
<bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jsr303-api-1.0.0/2.2.0
</bundle>
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.ant/1.8.2_2
</bundle>
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.dom4j/1.6.1_5
</bundle>
<bundle>wrap:mvn:postgresql/postgresql/9.1-901.jdbc4</bundle>
<!--<bundle>mvn:mysql/mysql-connector-java/5.1.18</bundle>-->
<bundle>blueprint:file:C:/Users/yahya/Desktop/Examples/Nouveau/HibernateOSGi-master/datasource-postgres.xml
</bundle>
<!-- These do not natively support OSGi, so wrap with BND. -->
<bundle>wrap:mvn:org.jboss/jandex/1.1.0.Alpha1</bundle>
<bundle>wrap:mvn:org.hibernate.common/hibernate-commons-annotations/4.0.1.Final</bundle>
<bundle>mvn:com.fasterxml/classmate/0.5.4</bundle>
<bundle>mvn:org.jboss.logging/jboss-logging/3.1.0.GA</bundle>
<!-- JACC is optional. -->
<!--<bundle>mvn:javax.servlet/javax.servlet-api/3.0.1</bundle> <bundle>mvn:org.jboss.spec.javax.security.jacc/jboss-jacc-api_1.4_spec/1.0.2.Final</bundle> -->
<!-- hibernate-validator is optional. -->
<!--<bundle>wrap:mvn:javax.validation/validation-api/1.0.0.GA</bundle>
<bundle>mvn:org.hibernate/hibernate-validator/4.2.0.Final</bundle> -->
<bundle>mvn:org.hibernate/hibernate-core/4.2.2.Final</bundle>
<bundle>mvn:org.hibernate/hibernate-entitymanager/4.2.2.Final</bundle>
<!-- TODO: It seems that the persistence unit bundle needs to be started
before hibernate-osgi. When the BundleActivator is started, the persistence
unit is provided even though HibernateOSGi_ContainerManaged hasn't completely
started yet. If that happens, you'll get an "illegal bundle state" exception.
Is there a way for the activator to watch for bundles with PUs before registering
the persistence provider? -->
<bundle>mvn:org.hibernate/HibernateOSGi_ContainerManaged/1.0.0
</bundle>
<bundle>mvn:org.hibernate/hibernate-osgi/4.2.2.Final</bundle>
</feature>
</features>
O stacktrace completo é:
javax.naming.NameNotFoundException:Osgi: Service/javax.sql.datasource/"(Osgi.jndi.service.name = jdbc/pós -grresds)" em org.apache.aries.jndi.url.serviceregistryContext.lookUp (ServicregistryContext.java:113) [ .apache.aries.jndi.url: 1.0.0] em org.apache.aries.jndi.url.serviceRegistryContext.lookup (serviceregistrycontext.java:144) [72: org.apache.aries.jndi.url: 1.0.0) ] at org.apache.arys.jndi.delegateContext.lookup (delegateContext.java:161) [70: org.apache.aries.jndi.core: 1.0.0] em javax.naming.initialContext.lookup (inicialContet.java: 411) [: 1.7.0_51] em org.apache.arys.jpa.container.unit.impl.jndidataSource.getds (jndidataSource.java:65) [67: org.apache.aries.jpa.container: 1.0.0] em org.apache.aries.jpa.container.unit.impl.delayedload OfficeUpDataSource.getConnection (atrasou a OBSOUPDATASOURCE.Java:36) [67: org.apache.aries.jpa.container: 1.0.0] em org.ib.ejbache.ejbache.jpa.container: 1.0.0] em org.bib.ejbache.ejbache.jpa. .InjectedDataSourceConnectionProvider.getConnection (injectedDataSourceConnectionProvider.java:70) [91: org.hibernate.entityManager: 4.2.2.Final] atrg.hibernate.engine.jenTalnBC.InTral.ennTerCerStimStisMplPlod.EngenCenstReStEnsTerSTerSTerSTerviceStisMpl $ pl.java:242) [ 90: org.hibernate.core: 4.2.2.Final] em org.hibernate.engine.jdbc.internal.jdbcservicesimpl.configure (jdbcservicesimpl.java:117) [90: org.hibernate.core: 4.2.2.2.final] em org.hibernate.service.internal.standardServiceRegistryImpl.configureservice (StandardServiceRegistryImpl.java:75) [90: org.iMerNate.abStractRealTerSportrySportrySportrySportrySportrySportrySportrySportryMergistryMigryMergistryMigryMergistryMigryMergistryMigryMergistryMignsital] : 159) [90: org.hibernate.core: 4.2.2.Final] em org.hibernate.service.internal.abstractStracticEregistryImpl.getService (abstractServiceregistryImpl.java:131) [90: Org.Ibrinate.core: 4.2.2. Final] em org.hibernate.cfg.configuration.buildtyperegistrações (confguration.java:1797) [90: org.hibernate.core: 4.2.2.Final] em org.hibernate.cfg.configuration.buildSessionFactory (confinciature.java:17 ) [90: org.hibernate.core: 4.2.2.Final] em org.hibernate.ejb.entityManagerFactoryImpl. (EntityManagerFactoryImpl.java:96) [91: org.hibernate.entityManager: 4.2.2.final] em org. hibernate.ejb.ejb3configuration.buildEntityManagerFactory (ejb3configuration.java:914) [91: org.hibernate.entityManager: 4.2.2.Final] em org.hibernate.osgi.osgipernceProvider.Createconterntity org .HIBERNATE.OSGI: 4.2.2.Final] em org.apache.arys.jpa.container.impl.entityManagerFactoryManager.CreateEntityManagerFacories (entityManagerFactoryManager.java:329) [67: org.apache.aries.jpa.container: 1.0) ] em org.apache.arys.jpa.container.impl.entityManagerFactoryManager.ReGisterityManagerFactories (EntityManagerFactoryManager.java:242) [67: orgache.apache.aries.jpa.container: 1.0.0] em org.apachearies.jpa. container.impl.entityManagerFactoryManager.bundlestateChange (entityManagerFactoryManager.java:185) [67: org.apache.arys.jpa.container: 1.0SistenceBundLlaMlager.ears.arysert.erSerMerSemeMetrensEngerSetrensEngerSetrensEngerSetrensEngerSetrenseMetrensePleStEnMelLander. java: 394) [67: org.apache.aries.jpa.container: 1.0.0] em org.apache.aries.jpa.container.impl.persistenceBundLemanager.addingService (PersistenceBundLemanager.Java:209) [67: Org.apache .ears.jpa.Container: 1.0.0] em org.osgi.util.tracker.servicetracker $ rastreado.customizeradding (servicetracker.java:932) [karaf.jar: 2.3.4] at org.osgi.util.tracker. ServiceTracker $ rastreado.customizerAdding (serviceTracker.java:1) [Karaf.jar: 2.3.4] em org.osgi.util.tracker.abstracttracked.trackadding (abstracked.java:256) [karaf.jar: 2.3.4] org.osgi.util.tracker.abstractTracked.track (abstracttracked.java:229) [karaf.jar: 2.3.4] em org.osgi.util.tracker.ServiceTracker $ rastreado.ServicEnged (ServiceTracker.java:84) [ .Jar: 2.3.4] em org.apache.felix.framework.util.eventdispatcher.invokeServiceListenCallback (eventdispatcher.java:932) [org.apache.felix.framework-4.0.3.jar:] em orgache.felix .framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)[org.apache.felix.framework-4.0.3.jar:] at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java: 543) [org.apache.felix.framework-4.0.3.jar:] em org.apache.felix.framework.felix.fireServiceEvent (felix.java:4260) [org.apache.felix.framework-4.0.3. jar:] em org.apache.felix.framework.felix.registerService (felix.java:3275) [org.apache.felix.framework-4.0.3.jar:] at org.apache.felix.framework.bundlecontextimpl.registerService (BundleContextImpl.java:346)[org.apache.felix.framework-4.0.3.jar:] at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320)[org.apache.felix.framework -4.0.3.jar:] em org.hibernate.osgi.hibernatebundleactivator.start (hibernatebundleactivator.java:80) [96: org.hibernate.osgi: 4.2.2. .SecureAction.StartActivator (SecureAction.java:645) [org.apache.felix.framework-4.0.3.jar:] em org.apache.felix.framework.felix.activatebunle (felix.java:197) [ORG.APACHE .felix.framework-4.0.3.jar:] em org.apache.felix.framework.felix.startbundle (felix.java:1895) [org.apache.felix.framework-4.0.3.jar:] em org. apache.felix.framework.bundleImpl.start (bundleImpl.java:944) [org.apache.felix.framework-4.0.3.jar:] em org.apache.felix.framework.bunleimpl.start (bundspl.java:931 ) [org.apache.felix.framework-4.0.3.jar:] em org.apache.karaf.Features.internal.featureserveServiceImpl.installFeatures (featureServiceImpl.java:488) [25: org.apache.karaf.features.core : 2.3.4] em org.apache.karaf.features.internal.featureServiceImpl.installfeature (featureServiceImpl.java:405) [25: org.apache.karaf.features.core: 2.3.4] at orgache.karaf. features.internal.FeaturesServiceImpl.installFeature(FeaturesServiceImpl.java:401)[25:org.apache.karaf.features.core:2.3.4] at org.apache.karaf.features.command.InstallFeatureCommand.doExecute(InstallFeatureCommand.java: 62) [27: org.apache.karaf.Features.Command: 2.3.4] em org.apache.karaf.Features.Command.FeaturesCommandSupport.doexecute (característicasCommandsupport.java:41) [27: org.apache.karaf.fera .Command: 2.3.4] em org.apache.karaf.shell.console.osgicommandsupport.execute (osgicommandsupport.java:38) [14: org.apache.karaf.shell.console: 2.3.4] em orgache. Felix.gogo.commands.basic.abstractCommand.execute (abstractcommand.java:35) [14: org.apache.karaf.shell.console: 2.3.4] em org.apache.felix.gogo.runtime.CommandProxy.execute ( CommandProxy.java:78) Oh14:org.apache.karaf.shell.console:2.3.4] em org.apache.felix.gogo.runtime.closure.exectecmd (fechamento.java:474) [14: org.apache .karaf.shell.console: 2.3.4] em org.apache.felix.gogo.runtime.closure.exectestatement (fechamento.java:400) [14: org.apache.karaf.shell.console: 2.3.4] em org.apache.felix.gogo.runtime.pipe.run (Pipe.java:108) [14: org.apache.karaf.shell.console: 2.3.4] em org.apache.felix.gogo.runtime.closure. execute (fechamento.java:183) [14: org.apache.karaf.shell.console: 2.3.4] em org.apache.felix.gogo.runtime.closure.execute (fechamento.java:120) [14: org .apache.karaf.shell.console: 2.3.4] em org.apache.felix.gogo.runtime.CommandSessionImpl.execute (commandSessionImpl.java:89) [14: org.apache.karaf.shell.console: 2.3.4 ] em org.apache.karaf.shell.console.jline.console.run (console.java:183) [14: org.apache.karaf.shell.console: 2.3.4] em java.lang.thread.run ( Thread.java:744)[:1.7.0_51
Resolvi esse problema e atualizei a lista de arquivos como disse M.Cristian, mas esse é outro problema estranho:ao reiniciar o Karaf e tentar inserir dados através do console do Karaf, o console imprime:Não há transação ativa, então tentei de outra forma usando o EntityManager e o problema não aparece mais.
Solução
Seu código não pode funcionar porque o DataSource é publicado no mesmo contexto do blueprint onde uma unidade de persistência é usada.
O problema é que o blueprint aguardará a injeção de um serviço EnitityManagerFactory.Portanto o DataSource nunca será publicado.Aries JPA detectará que deveria criar um EntityManagerFactory para seu pacote, mas atingirá o tempo limite ao tentar encontrar o DataSource.
Portanto, coloque o DataSource em um pacote rápido e ele deverá funcionar.