2016-08-07 23 views
0

Ich kann nicht die Blaupause für die Verwendung eines Dienstes vor Ort. Der Server OSGi (karaf) zeigt GracePeriod und eventuell ein Timeout an, das auf ILookupMfgService wartet.mit einer Java-Blueprint-Service-Definition

Wenn ich die Referenzlinie entferne, startet das Bündel und hat eine ILookupMfgService zur Verfügung.

Irgendwelche Vorschläge, was ich falsch mache?

Danke für die Hilfe mit meinem Lernen!

Timothy

<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" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" 

    xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0 
      http://www.w3.org/2001/XMLSchema-instance http://www.w3.org/2001/XMLSchema-instance 
      http://aries.apache.org/xmlns/jpa/v1.0.0 http://aries.apache.org/xmlns/jpa/v1.0.0 
      http://aries.apache.org/xmlns/transactions/v1.0.0 http://aries.apache.org/xmlns/transactions/v1.0.0 
      http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 "> 

<!-- implemenation of the service --> 
    <bean id="lookupMfgServiceStubImpl" class="com.services.jpa.LookupMfgServiceStub" scope="singleton" 
     init-method="init" /> 

<!-- create a service with the implementation --> 
    <service id="lookupMfgServiceStubLocal" ref="lookupMfgServiceStubImpl" interface="com.services.ILookupMfgService" /> 

<!-- create a reference for injecting into another bean - this line causes the GracePeriod/timeout --> 
    <reference id="lookupMfgServiceStubRef" interface="com.services.ILookupMfgService" availability="mandatory" ctivation="eager" /> 

    <bean id="EntityImpl" class="com.services.jpa.Entity" scope="singleton" init-method="init"> 
<!-- use the service - won't work without the reference above being valid --> 
     <property name="lookupMfg" ref="lookupMfgServiceRef" />  
    </bean> 
</blueprint> 

ohne Bezugslinie

[email protected]()> services -p 123 

com.server.services (123) provides: 
---------------------------------------- 
objectClass = [com.services.ILookupMfgService] 
osgi.service.blueprint.compname = lookupMfgServiceStubImpl 
service.id = 932 
---- 

Antwort

1

Sie müssen keine verbindliche Referenz erklären Service im gleichen Plan/Bündel ausgesetzt. Der Container ist verwirrt, weil er einen Dienst mit einem Verweis auf einen Dienst starten möchte, der noch nicht (selbst) vorhanden ist, was zu einem nicht wiederherstellbaren GracePeriod führt.

Eine grobe Analogie einer Referenz ist ein Java-Import von ein anderes Paket. Die Analogie eines Dienstes ist eine öffentliche Klasse. Sie benötigen den Import (= Verweis), wenn Sie eine Klasse aus einem anderen Paket verwenden möchten.

In Ihrem Beispiel brauchen Sie die Referenz nicht, weil Sie in Ihrem Bündel sind. Sie können stattdessen direkt auf Ihre deklarierte Bean verweisen:

p.s. Wenn kein anderes Paket Ihren LookupMfgService benötigt, dann können Sie sogar die Service Deklaration weglassen.