2017-02-27 1 views
3

j'ai une fonction de source de données qui exporte une source de données en tant que service OSGi:Karaf fonction d'installation manquant osgi.service exigence, mais il est là

> services -p 2038 
OPS4J Pax JDBC Config (2038) provides: 
-------------------------------------- 
objectClass = [org.osgi.service.cm.ManagedServiceFactory] 
service.bundleid = 2038 
service.id = 211 
service.pid = org.ops4j.datasource 
service.scope = singleton 
---- 
databaseName = foobar 
dataSourceName = fooDatasource 
felix.fileinstall.filename = file:/home/foousr/apache-karaf-4.0.6/etc/org.ops4j.datasource-foo.cfg 
objectClass = [javax.sql.DataSource] 
osgi.jndi.service.name = fooDatasource 
service.bundleid = 2038 
service.factoryPid = org.ops4j.datasource 
service.id = 251 
service.pid = org.ops4j.datasource.b3020619-71b9-4876-94c3-477f3e4a503d 
service.scope = singleton 
url = jdbc:oracle:thin:@dbserver:99999/foo 
user = FOOUSR 

Dans le cadre de la DS-fonctionnalité qui crée et enregistre ce service DataSource , il contient également un paquet ping-ds que je peux utiliser pour tester la source de données:

> jdbc:ping-ds fooDatasource 
Ping from localhost(127.0.0.1) as FOOUSR to schema FOOUSR on dbserver/foo 

J'ai un paquet de plan qui utilise cette source de données:

<?xml version="1.0" encoding="UTF-8"?> 
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/blueprint" 
    xsi:schemaLocation=" 
     http://www.osgi.org/xmlns/blueprint/v1.0.0 
     http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd 
     http://camel.apache.org/schema/blueprint 
     http://camel.apache.org/schema/blueprint/camel-blueprint.xsd 
     http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 
     http://svn.apache.org/repos/asf/aries/trunk/blueprint/blueprint-cm/src/main/resources/org/apache/aries/blueprint/compendium/cm/blueprint-cm-1.1.0.xsd"> 
    <reference id="ds" interface="javax.sql.DataSource" filter="(dataSourceName=fooDatasource)"/> 
    <camelContext id="fooDatasourceTestContext" trace="true" xmlns="http://camel.apache.org/schema/blueprint"> 
     <route id="fooDatasourceTest"> 
      <from uri="timer:/fooDatasourceTest?fixedRate=true&amp;repeatCount=1"/> 
      <setBody> 
       <simple> 
        select * from FOOUSR.FOOTABLE 
       </simple> 
      </setBody> 
      <to uri="jdbc:ds" /> 
      <to uri="log:fooDatasourceTest?showBody=true"/> 
     </route> 
    </camelContext> 
</blueprint> 

Lorsque je fais un feature:install foo-datasource-test-feature je reçois une erreur en me plaignant de ne pas être en mesure de trouver le service de la source de données - mais c'est là et je peux y accéder très bien avec mon ping-ds cmd.

Error executing command: Unable to resolve root: missing requirement [root] osgi.identity; 
osgi.identity=foo-datasource-test-feature; type=karaf.feature; version="[0.0.1.SNAPSHOT,0.0.1.SNAPSHOT]"; 
filter:="(&(osgi.identity=foo-datasource-test-feature)(type=karaf.feature)(version>=0.0.1.SNAPSHOT)(version<=0.0.1.SNAPSHOT))" 
[caused by: Unable to resolve foo-datasource-test-feature/0.0.1.SNAPSHOT: missing requirement 
[foo-datasource-test-feature/0.0.1.SNAPSHOT] osgi.identity; osgi.identity=com.company.project.foo-datasource-test; 
type=osgi.bundle; version="[0.0.1.SNAPSHOT,0.0.1.SNAPSHOT]"; resolution:=mandatory [caused by: Unable to resolve 
com.company.project.foo-datasource-test/0.0.1.SNAPSHOT: missing requirement 
[com.company.project.foo-datasource-test/0.0.1.SNAPSHOT] osgi.service; effective:=active; 
filter:="(&(objectClass=javax.sql.DataSource)(dataSourceName=fooDatasource))"]] 

Il semble se plaindre qu'il ne peut pas trouver installé datasource du service OSGi:

osgi.service; effective:=active; 
filter:="(&(objectClass=javax.sql.DataSource)(dataSourceName=fooDatasource))"]] 

Ce qui est étrange, outre le fait que la commande ping-dSi écrit fonctionne très bien, est que si je viens d'installer le faisceau de test qui est dans la fonctionnalité dont il se plaint, cela fonctionne très bien. Ce qui signifie que c'est une sorte de problème avec la fonctionnalité: processus d'installation lui-même.

Dans la fonction foo-datasource-test-fonctionnalité, j'inclure une fonction foo-core qui fait référence à la DS-fonction:

foo-datasource-test-feature.xml:

<?xml version="1.0" encoding="utf-8"?> 
<features name="foo-datasource-test" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0"> 
    <feature name="foo-datasource-test-feature" version="${project.version}"> 
     <feature>foo-core-feature</feature> 
     <bundle>mvn:com.company.project/foo-datasource-test/${project.version}</bundle> 
    </feature> 
</features 

foo-core-feature.xml:

<?xml version="1.0" encoding="utf-8"?> 
<features name="foo-core" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0"> 
    <feature name="foo-core-feature" version="${project.version}"> 
     <feature>ds-feature</feature> 
     ... 
    </feature> 
</features> 

ds-features.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<features name="ds-features" xmlns="http://karaf.apache.org/xmlns/features/v1.0.0"> 
    <feature name="ds-feature" version="${project.version}" > 
     <feature>pax-jdbc-config</feature> 
     ... 
     <bundle start-level="86">mvn:com.company.commons/foo-datasource/${project.version}</bundle> 
    </feature> 
    <feature name="ds-ping-datasource" version="${project.version}" > 
     <bundle start-level="80">mvn:com.company.commons/foo-ping-datasource/${project.version}</bundle> 
     <feature>pax-jdbc-config</feature> 
    </feature> 
</features> 

Cela pose-t-il un problème? Si c'est le cas, puisque la fonction foo-datasource-test-dépend du service de source de données déjà installé, quelle serait alors la bonne façon de décrire cette dépendance dans mes fonctionnalités?

utilisant:

Karaf Version 4.0.6

version Camel 2.16.5

MISE À JOUR

Je commentais la référence à la fonction de base de sorte que tout le paquet était dans la fonction de test et il se plaint encore. Cela n'a donc rien à voir avec la fonctionnalité permettant de gérer les dépendances. Je vais essayer la version 4.1.0 de Karaf.

MISE À JOUR

Pas de joie sur 4.1.0. En remarque, il y avait encore plus de problèmes puisque activemq-client 5.14.4 n'est pas encore construit.

Répondre

2

Apparemment, feature:install cherchait le service non dans le registre du service OSGi, mais dans un MANIFEST ailleurs.Un collègue m'a regardant les fichiers MANIFEST et j'ai remarqué dans le foo-datasource test qu'il avait un en-tête Import-service dans son fichier MANIFESTE:

Import-Service: javax.sql.DataSource;multiple:=false;filter=(dataSourceName=fooDatasource) 

Il semblait que l'erreur était parce qu'il était faire ce que mon fichier MANIFEST lui demandait de faire - à savoir importer le service. Pourquoi il ne pouvait pas le trouver dans le registre de service OSGi, je ne sais pas. Mais il n'y avait pas de service d'exportation correspondant dans les fichiers MANIFEST. Mais, étant donné que le service d'importation et le service d'exportation sont obsolètes et que mon ancien code fonctionnant sur un fusible que je migre vers karaf n'a pas été informé ;-) J'ai décidé de trouver simplement un moyen de supprimer toute importation ou exportation. En-têtes de service

Après this advice, j'ajouté

<_removeheaders>Import-Service,Export-Service</_removeheaders> 

dans la partie instructions du maven-plugin-paquet dans mon foo-core-fonction pom.xml (rappelons que foo-datasource-test-fonctionnalité dépend de foo -core-métrage):

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <version>3.2.0</version> 
       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
        . . . 
         <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName> 
         <Import-Package>*,org.apache.camel.core.osgi</Import-Package> 
         <_removeheaders>Import-Service,Export-Service</_removeheaders> 
        </instructions> 
       </configuration> 
      </plugin> 
     <plugins> 
</build> 

Après mvn clean deploy, le feature:install a travaillé, et il a couru très bien (trouvé la source de données, utilisés et retournés jeu de résultats SQL).

Comme d'habitude, après avoir cherché pendant une longue période de temps, c'était quelque chose de simple ou de basique. Je ne suis pas sûr pourquoi le feature:install ne vérifierait pas seulement le registre d'OSGi de toute façon, mais il y a probablement une bonne raison (j'espère) pour cela ne comptant pas dessus et recherchant un entête MANIFEST. Vous ne savez pas si l'en-tête Provide-Capability fonctionne mieux dans ce scénario, mais peut-être essayer.

+0

Le correctif client-activemq a été créé pour le 5.14.4 aujourd'hui (https://repository.apache.org/content/repositories/releases/org/apache/activemq/activemq-client/5.14.4/), donc j'ai changé Retour à l'utilisation de karaf 4.1.0 et j'utilise les versions suivantes: activemq.version = 5.14.4 camel.version = 2.18.2 spring.version = 4.3.5.RELEASE – bmcdonald

+0

J'ai juste le même problème, seulement avec l'en-tête Require-Capability généré automatiquement dans les bundles avec l'unité de persistance. Fait intéressant, il a déjà travaillé, puis «soudainement» arrêté. Malheureusement, il y a beaucoup de choses à Karaf qui sont terriblement écrites. –