2016-04-25 6 views
0

Ich muss einen Dienst schreiben, auf den remote zugegriffen werden kann. Ich verwende cxf-dosgi-ri-singlebundle-distribution-1.4.0. So machte ich die API, dann die Umsetzung mit diesen Eigenschaften:Distributed OSGi - Consuming der Dienst

Dictionary<String, String> restProps = new Hashtable<String, String>(); 

restProps.put("service.exported.interfaces", "*"); 
restProps.put("service.exported.configs", "org.apache.cxf.ws"); 
restProps.put("org.apache.cxf.ws.address", "http://192.168.0.3:9090/preview"); 
bundleContext.registerService(Preview.class.getName(), new PreviewService(),restProps); 

Wenn ich stationieren das Bündel, (nach der api und der d-osgi jar bereitstellen) kann ich die WSDL im Browser sehen, auch vom entfernten Computer. "http://192.168.0.3:9090/preview?wsdl" gefällt das.

Aber dann kommt der Verbraucher. Es ist OSGi-INF/Remote-Service/Remote-services.xml im Client-jar mit:

<endpoint-descriptions xmlns="http://www.osgi.org/xmlns/rsa/v1.0.0"> 
<endpoint-description> 
<property name="objectClass"> 
    <array> 
     <value>com.liferay.preview.api</value> 
    </array> 
</property> 
<property name="endpoint.id">http://192.168.0.3:9090/preview</property> 
<property name="service.imported.configs">org.apache.cxf.ws</property> 
</endpoint-description> 
</endpoint-descriptions> 

I das Bündel bereitstellen kann (nach dem OSGi-d Bündel und die API bereitstellen), aber ich m immer Null Referenzen zurück. Die Tutorials immer mit Codes wie diese

st = new ServiceTracker(bundleContext, MyService.class.getName(), null) { 
    @Override 
    public Object addingService(ServiceReference reference) { 
    Object svc = bundleContext.getService(reference); 
    if (svc instanceof MyService) { 
     printServiceInfo((MyService) svc); 
    } 

    return super.addingService(reference); 
    } 
}; 
st.open(); 

Aber ich bin mit Liferay 7, wo ich diese nicht nutzen kann (kein Konstruktor für Servicetracker - Ich kann nur eine Servicetracker Instanz zurück von einer Registry Instanz erhalten)

Der OSGi Container ist Felix.

ich es irgendwo gelesen habe, dass, wenn ich die WSDL-Beschreibung, wie oben zu sehen zugreifen können, und lassen Sie uns sagen, es ist eine Methode, hallo() in meinem API, dann ein „http://192.168.0.3:9090/preview/hello“ Aufruf funktionieren sollte .. Aber es tut es nicht. Ich weiß nicht einmal, wie man das debuggt. (Ohne die Remote-Sache, lokal, in dem gleichen Container, der Methodenaufruf funktioniert)

Jede Hilfe könnte gut kommen! Vielen Dank!

Antwort

0

Eine einfachere Lösung wäre die Verwendung der zookeeperbasierten Erkennung. Der Server-Knoten veröffentlicht die Dienste, die er in zoekeeper exportiert, und der Consumerknoten erstellt sofort verwendbare OSGi-Dienste für diese, sobald ein Paket einen solchen Dienst anfordert.

+0

In diesem Fall benötigt der Client keine remote-services.xml? –

+0

Genau. Weitere Informationen finden Sie in diesem Tutorial http://liquid-reality.de/display/liquid/2013/02/13/Apache+Karaf+Tutorial+Part+8+-+Distributed+OSGi Btw. Es gibt jetzt auch Aries RSA, die neben dem CXF einen schnellen binären Transport bietet. Siehe http://aries.apache.org/modules/rsa.html –

0

Riena Communication es ist weniger kompliziert für die Veröffentlichung und verbindliche Remote-Dienste. Es verwendet Hessian als Kommunikationsprotokoll. es ist wirklich schnell im Vergleich zu Seife, da sein binärbasiertes Protokoll (nicht xml)

ich hoffe, dass dies hilft.

+0

Haben Sie versucht, ein eigenes Beispiel dafür zu schreiben? Dieses Tutorial ist ein bisschen kurz, da es keinen Quellcode gibt :( –

0

Sie sollten den Liferay SOAP Extender verwenden, der auf Apache CXF basiert. Sie finden ein Beispiel für das Liferay Developer Network.