Jump to: navigation, search

Difference between revisions of "ECF/Getting Started with Remote Services API"

< ECF
(Service Interface)
 
(16 intermediate revisions by 2 users not shown)
Line 2: Line 2:
  
 
In addition you will need Equinox in your target platform (either the [http://download.eclipse.org/equinox/ Equinox 3.5 SDK] or the parts that come with Eclipse).  
 
In addition you will need Equinox in your target platform (either the [http://download.eclipse.org/equinox/ Equinox 3.5 SDK] or the parts that come with Eclipse).  
 +
 +
To see how the ECF Remote Services API fits into the overall picture of supporting Distributed OSGi, see [[Distributed OSGi Services with ECF]].
  
 
===Service Interface===
 
===Service Interface===
  
As with any OSGi service, you must first define your service interface.  Here is a trivial example 'hello' service interface:
+
As with any OSGi service, you must first define your service interface.  Here is a example 'hello' service interface:
  
 
<source lang="java">package org.eclipse.ecf.examples.remoteservices.hello;
 
<source lang="java">package org.eclipse.ecf.examples.remoteservices.hello;
Line 11: Line 13:
 
public interface IHello {
 
public interface IHello {
  
public void hello(String from);
+
public String hello(String from);
 
 
 
}
 
}
 
</source>
 
</source>
  
This service is defined, along with a simple implementation, in this project in CVS
+
[[Getting the Hello Example Remote Service | Click here to retrieve the Hello Example source into your local workspace]]
 
+
cvs: ''':pserver:anonymous@dev.eclipse.org:/cvsroot/rt'''<br>
+
modules: '''org.eclipse.ecf/examples/bundles/org.eclipse.ecf.examples.remoteservices.hello''', '''org.eclipse.ecf/examples/bundles/org.eclipse.ecf.examples.remoteservices.hello.host.rs''', '''org.eclipse.ecf/examples/bundles/org.eclipse.ecf.examples.remoteservices.hello.consumer.rs'''
+
 
+
Here is a [[Media:Hellors.psf|project set file]] for these projects.
+
 
+
The service interface above is contained in the o.e.e.e.remoteservices.hello bundle, along with a trivial implementation (in org.eclipse.ecf.examples.remoteservices.hello.impl.Hello).
+
  
 
===Registering the Service (Host)===
 
===Registering the Service (Host)===
  
Here is the code in org.eclipse.ecf.internal.examples.remoteservices.hello.host.rs.Activator that registers a remote service with the ECF RFC119 implementation:
+
Here is the code in org.eclipse.ecf.internal.examples.remoteservices.hello.host.rs.Activator that registers a remote service with the ECF Remote Service API:
  
 
<source lang="java">
 
<source lang="java">
Line 72: Line 67:
  
 
<source lang="java">
 
<source lang="java">
 +
public static final String ROSGI_SERVICE_HOST = "r-osgi://localhost:9278";
 +
 
public void start(BundleContext context) throws Exception {
 
public void start(BundleContext context) throws Exception {
 
this.context = context;
 
this.context = context;
// Create R-OSGi Container
+
// 1. Create R-OSGi Container
 
IContainerManager containerManager = getContainerManagerService();
 
IContainerManager containerManager = getContainerManagerService();
 
container = containerManager.getContainerFactory().createContainer(
 
container = containerManager.getContainerFactory().createContainer(
 
"ecf.r_osgi.peer");
 
"ecf.r_osgi.peer");
// Get remote service container adapter
+
// 2. Get remote service container adapter
 
IRemoteServiceContainerAdapter containerAdapter = (IRemoteServiceContainerAdapter) container
 
IRemoteServiceContainerAdapter containerAdapter = (IRemoteServiceContainerAdapter) container
 
.getAdapter(IRemoteServiceContainerAdapter.class);
 
.getAdapter(IRemoteServiceContainerAdapter.class);
// Lookup IRemoteServiceReference
+
// 3. Lookup IRemoteServiceReference
 
IRemoteServiceReference[] helloReferences = containerAdapter
 
IRemoteServiceReference[] helloReferences = containerAdapter
 
.getRemoteServiceReferences(IDFactory.getDefault().createID(
 
.getRemoteServiceReferences(IDFactory.getDefault().createID(
container.getConnectNamespace(), RSGI_SERVICE_HOST),
+
container.getConnectNamespace(), ROSGI_SERVICE_HOST),
 
IHello.class.getName(), null);
 
IHello.class.getName(), null);
 
Assert.isNotNull(helloReferences);
 
Assert.isNotNull(helloReferences);
 
Assert.isTrue(helloReferences.length > 0);
 
Assert.isTrue(helloReferences.length > 0);
// Get remote service for reference
+
// 4. Get remote service for reference
 
IRemoteService remoteService = containerAdapter
 
IRemoteService remoteService = containerAdapter
 
.getRemoteService(helloReferences[0]);
 
.getRemoteService(helloReferences[0]);
// Get the proxy
+
// 5. Get the proxy
 
IHello proxy = (IHello) remoteService.getProxy();
 
IHello proxy = (IHello) remoteService.getProxy();
// Finally...call the proxy
+
// 6. Finally...call the proxy
proxy.hello("RemoteService Consumer");
+
String response = proxy.hello("RemoteService Consumer");
  
 
}
 
}
Line 103: Line 100:
 
#Creates a container r-osgi container instance.
 
#Creates a container r-osgi container instance.
 
#Gets the remote service container adapter.
 
#Gets the remote service container adapter.
#Looksup IRemoteServiceReference array for the IHello service using the r-osgi://localhost:9278 host (the value of ROSGI_SERVICE_HOST).
+
#Looks up IRemoteServiceReference array for the IHello service using ID with value 'r-osgi://localhost:9278'.
 
#Gets the IRemoteService for the given IRemoteServiceReference.
 
#Gets the IRemoteService for the given IRemoteServiceReference.
 
#Gets a proxy via the IRemoteService.getProxy(), and casts it to the IHello interface.
 
#Gets a proxy via the IRemoteService.getProxy(), and casts it to the IHello interface.
Line 114: Line 111:
 
hello from=RemoteService Consumer
 
hello from=RemoteService Consumer
 
</pre>
 
</pre>
 +
 +
the 'hello from=RemoteService Consumer' is the host receiving the remote method call.
 +
 +
===Asynchronous Remote Method Invocation===
 +
 +
New: See support for [[Asynchronous Remote Services]]
 +
 +
 +
===Related Documentation===
 +
 +
[[Asynchronous Remote Services]]
 +
 +
[[Distributed OSGi Services with ECF]]
 +
 +
[[Getting Started with ECF's RFC119 Implementation]]
 +
 +
[[Disabling R-OSGi]]
 +
 +
[[R-OSGi_Properties]]
 +
 +
[[Distributed EventAdmin Service]]
  
 
{{ECF}}
 
{{ECF}}
 
[[Category:Eclipse Communication Framework]]
 
[[Category:Eclipse Communication Framework]]
 
[[Category:EclipseRT]]
 
[[Category:EclipseRT]]
 +
[[Category:Draft Documentation]]

Latest revision as of 02:56, 16 July 2011

Install ECF 3.0. See ecf download.

In addition you will need Equinox in your target platform (either the Equinox 3.5 SDK or the parts that come with Eclipse).

To see how the ECF Remote Services API fits into the overall picture of supporting Distributed OSGi, see Distributed OSGi Services with ECF.

Service Interface

As with any OSGi service, you must first define your service interface. Here is a example 'hello' service interface:

package org.eclipse.ecf.examples.remoteservices.hello;
 
public interface IHello {
 
	public String hello(String from);
 
}

Click here to retrieve the Hello Example source into your local workspace

Registering the Service (Host)

Here is the code in org.eclipse.ecf.internal.examples.remoteservices.hello.host.rs.Activator that registers a remote service with the ECF Remote Service API:

	public void start(BundleContext context) throws Exception {
		this.context = context;
		// Create R-OSGi Container
		IContainerManager containerManager = getContainerManagerService();
		container = containerManager.getContainerFactory().createContainer(
				"ecf.r_osgi.peer");
		// Get remote service container adapter
		IRemoteServiceContainerAdapter containerAdapter = (IRemoteServiceContainerAdapter) container
				.getAdapter(IRemoteServiceContainerAdapter.class);
		// Register remote service
		serviceRegistration = containerAdapter.registerRemoteService(
				new String[] { IHello.class.getName() }, new Hello(), null);
		System.out.println("IHello RemoteService registered");
	}

This code does the following:

  1. Creates an r-osgi ECF container to do the distribution.
  2. Gets the containerAdapter from the container instance so that remote services can be registered/accessed.
  3. Creates and registers the IHello implementation.

Here is the expected output to the console for this host

osgi> IHello RemoteService registered

If you get the following warning when starting the host:

osgi> WARNING: Port 9278 already in use. This instance of R-OSGi is running on port 9279

This means that there is some other R-OSGi instance running on that same system, and that port 9278 is not available for use by the host. In this case, you need to stop the host, and disable the other R-OSGi instance before running the host again. To disable R-OSGI, see Disabling R-OSGi and R-OSGI Properties.

Using the Service (Consumer)

The ECF remote services API consumer essentially needs to lookup the remote reference, and then use the Here is code from org.eclipse.ecf.internal.examples.remoteservices.hello.consumer.rs.Activator

	public static final String ROSGI_SERVICE_HOST = "r-osgi://localhost:9278";
 
	public void start(BundleContext context) throws Exception {
		this.context = context;
		// 1. Create R-OSGi Container
		IContainerManager containerManager = getContainerManagerService();
		container = containerManager.getContainerFactory().createContainer(
				"ecf.r_osgi.peer");
		// 2. Get remote service container adapter
		IRemoteServiceContainerAdapter containerAdapter = (IRemoteServiceContainerAdapter) container
				.getAdapter(IRemoteServiceContainerAdapter.class);
		// 3. Lookup IRemoteServiceReference
		IRemoteServiceReference[] helloReferences = containerAdapter
				.getRemoteServiceReferences(IDFactory.getDefault().createID(
						container.getConnectNamespace(), ROSGI_SERVICE_HOST),
						IHello.class.getName(), null);
		Assert.isNotNull(helloReferences);
		Assert.isTrue(helloReferences.length > 0);
		// 4. Get remote service for reference
		IRemoteService remoteService = containerAdapter
				.getRemoteService(helloReferences[0]);
		// 5. Get the proxy
		IHello proxy = (IHello) remoteService.getProxy();
		// 6. Finally...call the proxy
		String response = proxy.hello("RemoteService Consumer");
 
	}

This code

  1. Creates a container r-osgi container instance.
  2. Gets the remote service container adapter.
  3. Looks up IRemoteServiceReference array for the IHello service using ID with value 'r-osgi://localhost:9278'.
  4. Gets the IRemoteService for the given IRemoteServiceReference.
  5. Gets a proxy via the IRemoteService.getProxy(), and casts it to the IHello interface.
  6. Makes the remote call (proxy.hello("RemoteService Consumer")

The output on the remote service host is

osgi> IHello RemoteService registered
hello from=RemoteService Consumer

the 'hello from=RemoteService Consumer' is the host receiving the remote method call.

Asynchronous Remote Method Invocation

New: See support for Asynchronous Remote Services


Related Documentation

Asynchronous Remote Services

Distributed OSGi Services with ECF

Getting Started with ECF's RFC119 Implementation

Disabling R-OSGi

R-OSGi_Properties

Distributed EventAdmin Service

Eclipse Communication Framework
API
API DocumentationJavadocProviders
Development
Development GuidelinesIntegrators Guide