...
It assumes that you have set up your DOSGi/ZooKeeper based Discovery system as outlined in the DOSGi Discovery page.
NOTE: this demo requires CXF/DOSGi 1.1-SNAPSHOT
Demo design
This demo consists of a display controller node that writes messages on all the available display instances. Display instances are realized as remote OSGi services, which are registered with the ZooKeeper-based Discovery system. The discovery system informs the controller, which is a consumer of the DisplayServices, of any available remote instances of this service.
@@@ add an image here @@@
...
Running the controller
Code Block |
---|
-> install httpshttp://repositoryrepo1.apachemaven.org/contentmaven2/groups/snapshots/org/apache/cxf/dosgi/samples/cxf-dosgi-ri-samples-discovery-clientinterface/1.1-SNAPSHOT2/cxf-dosgi-ri-samples-discovery-clientinterface-1.1-SNAPSHOT2.jar -> installstart httpshttp://repositoryrepo1.apachemaven.org/content/groups/snapshotsmaven2/org/apache/cxf/dosgi/samples/cxf-dosgi-ri-samples-discovery-interfaceclient/1.1-SNAPSHOT2/cxf-dosgi-ri-samples-discovery-interfaceclient-1.1-SNAPSHOT2.jar -> start 7 -> start 8 -> ps START LEVEL 1 ID State Level Name [ 0] [Active ] [ 0] System Bundle (1.8.0) [ 1] [Active ] [ 1] Apache Felix Shell Service (1.2.0) [ 2] [Active ] [ 1] Apache Felix Shell TUI (1.2.0) [ 3] [Active ] [ 1] Apache Felix Bundle Repository (1.4.0) [ 4] [Resolved ] [ 1] OSGi R4 Compendium Bundle (4.1.0) [ 5] [Active ] [ 1] Distributed OSGi Distribution Software Single-Bundle Distribution [ 6] [Active ] [ 1] Distributed OSGI OSGiDiscovery Zookeeper-BasedSample DiscoveryClient Single-Bundle Distribution [ 7] [Active ] [ 1] Distributed OSGI Discovery Sample Client Bundle [ 8] [Active ] [ 1] Distributed OSGI Discovery Sample Interface Bundle Interface Bundle |
After a brief moment, you will see messages appearing on the After a brief moment, you will see messages appearing on the controller side. These are the messages sent to all registered displays. Since there are none, they won't show up anywhere just yet.
...
Code Block | ||||
---|---|---|---|---|
| ||||
public class Activator implements BundleActivator { private ServiceRegistration reg; public void start(BundleContext bc) throws Exception { Dictionary props = new Hashtable(); String host = getHostName(); // obtain the current host name int port = getPort(); // find a free port props.put("osgiservice.remoteexported.interfaces", "*"); props.put("osgiservice.remoteexported.configuration.typeconfigs", "pojoorg.apache.cxf.ws"); props.put("osgiorg.remoteapache.configurationcxf.pojows.address", "http://" + host + ":" + port + "/display"); reg = bc.registerService(DisplayService.class.getName(), new DisplayServiceImpl(host + ":" + port), props); } public void stop(BundleContext bc) throws Exception { reg.unregister(); } } |
...
Once the provider side bundles are started:
Code Block |
---|
-> install httpshttp://repositoryrepo1.apachemaven.org/content/groups/snapshotsmaven2/org/apache/cxf/dosgi/samples/cxf-dosgi-ri-samples-discovery-interface/1.1-SNAPSHOT2/cxf-dosgi-ri-samples-discovery-interface-1.1-SNAPSHOT2.jar -> start 7 -> install httpshttp://repositoryrepo1.apachemaven.org/contentmaven2/groups/snapshots/org/apache/cxf/dosgi/samples/cxf-dosgi-ri-samples-discovery-impl/1.1-SNAPSHOT2/cxf-dosgi-ri-samples-discovery-impl-1.1-SNAPSHOT2.jar -> start 8 -> ps START LEVEL 1 ID State Level Name [ 0] [Active ] [ 0] System Bundle (1.8.0) [ 1] [Active ] [ 1] Apache Felix Shell Service (1.2.0) [ 2] [Active ] [ 1] Apache Felix Shell TUI (1.2.0) [ 3] [Active ] [ 1] Apache Felix Bundle Repository (1.4.0) [ 4] [Resolved ] [ 1] OSGi R4 Compendium Bundle (4.1.0) [ 5] [Active ] [ 1] Distributed OSGi Distribution Software Single-Bundle Distribution (1.1.0.SNAPSHOT) [ 6] [Active ] [ 1] Distributed OSGi Zookeeper-BasedOSGI Discovery Single-BundleSample Distribution (1.1.0.SNAPSHOT)Interface Bundle [ 7] [Active ] [ 1] Distributed OSGI Discovery Sample InterfaceImplementation Bundle |
You will start seeing the messages appear on the remote display:
Code Block |
---|
DisplayService [myhost:1816]: some 8] [Active ] [ 1] Distributed OSGI Discovery Sample Implementation Bundle |
You will start seeing the messages appear on the remote display:
Code Block |
---|
text 145 DisplayService [myhost:1816]: some text 145146 DisplayService [myhost:1816]: some text 146 ... ... |
You can You can add more Display Services and they will also receive the messages.
...
ZooKeeper comes with a client program (zkCli
) that allows you to look in the ZooKeeper virtual filesystem. All of the OSGi-registered services are stored in a virtual directory under the node /osgi/service_registry
. The virtual directory name is based on the fully qualified name of the interface that is implemented by the remote service. So in the case of the DisplayService the remote service metadata is stored under /osgi/service_registry/org/apache/cxf/dosgi/samples/discovery/DisplayService
:
Code Block |
---|
$ bin/zkCli.cmd localhost:2181
-> ls /osgi/service_registry/org/apache/cxf/dosgi/samples/discovery/DisplayService
Processing ls
[myhost#1816##display]
|
...
Code Block |
---|
-> get /osgi/service_registry/org/apache/cxf/dosgi/samples/discovery/DisplayService/myhost#1816##display Processing get # #Tue Jun 09 14:52:39 BST 2009 osgi.remote.endpoint.location=http\://myhost\:1816/display osgi.remote.interfaces=* osgi.remote.configuration.pojo.address=http\://myhost\:1816/display osgi.remote.configuration.type=pojo osgi.remote.endpoint.id=0ffe1fbf-c029-4096-bc14-3c7d77470dfd cZxid = 511 ctime = Tue Jun 09 14:52:39 BST 2009 mZxid = 511 mtime = Tue Jun 09 14:52:39 BST 2009 pZxid = 511myhost#52807##display <?xml version="1.0" encoding="UTF-8"?> <endpoint-descriptions xmlns="http://www.osgi.org/xmlns/rsa/v1.0.0"> <endpoint-description> <property name="endpoint.framework.uuid" value="b151dd13-69fe-4d99-8006-fcdafeb48db8" /> <property name="endpoint.id" value="http://myhost:52807/display" /> <property name="endpoint.package.version.org.apache.cxf.dosgi.samples.discovery" value="0.0.0" /> <property name="endpoint.service.id" value-type="Long" value="16" /> <property name="objectClass"> <array> <value>org.apache.cxf.dosgi.samples.discovery.DisplayService</value> </array> </property> <property name="org.apache.cxf.ws.address" value="http://myhost:52807/display" /> <property name="service.imported" value="true" /> <property name="service.imported.configs"> <array> <value>org.apache.cxf.ws</value> </array> </property> <property name="service.intents"> <array> <value>SOAP.1_1</value> <value>HTTP</value> <value>SOAP</value> </array> </property> </endpoint-description> </endpoint-descriptions> cZxid = 0x13 ctime = Fri Jun 25 15:57:09 BST 2010 mZxid = 0x13 mtime = Fri Jun 25 15:57:09 BST 2010 pZxid = 0x13 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 815631244713656340x1296f9228b40004 dataLength = 3381150 numChildren = 0 |
Other Resources
Introducing Dynamic Discovery into OSGi Distributed Applications - http://blog.akquinet.de/2009/09/23/introducing-dynamic-discovery-into-osgi-distributed-applications/