Skip to main content
Jump to: navigation, search

Difference between revisions of "Distribution Providers"

Line 1: Line 1:
 
==Introduction==
 
==Introduction==
  
The Remote Services/Remote Service Admin specifications (chaps 100 and 122 in [http://www.osgi.org/Specifications/HomePage OSGi Enterprise spec]) allows for the use of multiple distribution providers.  A separate distribution provider(s) can be defined for every exported remote service.  Such providers are responsible for the actual marshalling/serialization and network communication that takes place when a consumer invokes a remote service method.
+
New:  ECF OSGi R7 Remote Services.  The [https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.htmlOSGi R7 Remote Services] adds the standardization of several [https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#i1693415 intents].  One of those intents is the [osgi.async intent], which allows remote services to be invoked asynchronously (non-blocking) rather than synchronously (blocking).  Supporting async and the other standardized intents:  [https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#service.remoteservices-osgi.basic osgi.basic], [https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#d0e1474 osgi.private], [https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#d0e1464 osgi.confidential] requires a distribution provider that supports that intent.  For each distribution provider below, the currently supported intents are listed.  To request support for an unsupported intent, please post the request to the [https://accounts.eclipse.org/mailing-list/ecf-dev ecf-dev mailing list].
 +
 
 +
The Remote Services/Remote Service Admin specifications (chaps 100 and 122 in [https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteserviceadmin.html OSGi Enterprise spec]) allows for the use of multiple distribution providers.  Distribution providers are responsible for the actual marshalling/serialization and network communication when a consumer invokes a remote service method.
  
 
The [[OSGi_Remote_Services_and_ECF | ECF Architecture]] also allows the use of multiple distribution providers.  Further, ECF's open APIs and implementations supports the creation of custom distribution providers using any desired transport protocols, serialization formats and/or libraries.
 
The [[OSGi_Remote_Services_and_ECF | ECF Architecture]] also allows the use of multiple distribution providers.  Further, ECF's open APIs and implementations supports the creation of custom distribution providers using any desired transport protocols, serialization formats and/or libraries.
Line 10: Line 12:
  
 
Symbolic Name:  [http://git.eclipse.org/c/ecf/org.eclipse.ecf.git/tree/framework/bundles/org.eclipse.ecf.remoteservice org.eclipse.ecf.remoteservice]<br>
 
Symbolic Name:  [http://git.eclipse.org/c/ecf/org.eclipse.ecf.git/tree/framework/bundles/org.eclipse.ecf.remoteservice org.eclipse.ecf.remoteservice]<br>
Minimum EE: J2SE-1.5+<br>
+
Minimum EE: J2SE-1.7+<br>
 
Dependencies<br>
 
Dependencies<br>
*Framework: OSGi R5+
+
*Framework: OSGi R6+ (Equinox Mars+)
 
*ECF Core Bundles:  [http://git.eclipse.org/c/ecf/org.eclipse.ecf.git/tree/framework/bundles/org.eclipse.ecf org.eclipse.ecf], [http://git.eclipse.org/c/ecf/org.eclipse.ecf.git/tree/framework/bundles/org.eclipse.ecf.identity org.eclipse.ecf.identity]
 
*ECF Core Bundles:  [http://git.eclipse.org/c/ecf/org.eclipse.ecf.git/tree/framework/bundles/org.eclipse.ecf org.eclipse.ecf], [http://git.eclipse.org/c/ecf/org.eclipse.ecf.git/tree/framework/bundles/org.eclipse.ecf.identity org.eclipse.ecf.identity]
 
*org.eclipse.equinox.concurrent.future bundle
 
*org.eclipse.equinox.concurrent.future bundle
Line 20: Line 22:
  
 
All ECF RSA distribution providers implement the RSAPI.
 
All ECF RSA distribution providers implement the RSAPI.
 
==[https://github.com/ECF/kryo-serialization Kryo Serialization]==
 
 
This set of projects enhances the [https://wiki.eclipse.org/Distribution_Providers#Generic_Provider ECF generic providers] to use [https://github.com/EsotericSoftware/kryo Kryo serialization] rather than Java serialization.  [https://github.com/EsotericSoftware/kryo Kryo serialization] is a fast and efficient object serialization for Java.
 
 
See the example of usage and documentation described on the [https://github.com/ECF/kryo-serialization main Kryo serialization project page].
 
 
===Bundles===
 
 
org.eclipse.ecf.provider.sharedobject.serializer.kryo<br>
 
 
===Dependencies===
 
 
'''org.eclipse.ecf.provider.sharedobject.serializer.kryo''':  ECF Core, RSAPI, [https://github.com/EsotericSoftware/kryo Kryo Serialization]
 
 
===Source Code===
 
 
[https://github.com/ECF ECF Github] Repo: [https://github.com/ECF/kryo-serialization Kryo Serialization for Generic Provider Github Repo], Paths:<br>
 
'''org.eclipse.ecf.provider.sharedobject.serializer.kryo''': org.eclipse.ecf.sharedobject.serializer.kryo<br>
 
 
==[https://github.com/ECF/Py4j-RemoteServicesProvider Python OSGi Services Provider]==
 
 
Please see [[Tutorial: Python for OSGi Services]]
 
 
===Download/Install===
 
 
A binary build (p2) of this provider is available [https://github.com/ECF/Py4j-RemoteServicesProvider/releases here]
 
 
===Source Code===
 
 
[https://github.com/ECF ECF Github] Repo: [https://github.com/ECF/Py4j-RemoteServicesProvider ECF Python Provider Github Repo]
 
 
==[http://www.grpc.io/ Google RPC (grcp)] Provider==
 
 
====OSGi Configuration Types/ECF Container Types====
 
'''ecf.grpc.server'''<br>
 
'''ecf.grpc.client'''<br>
 
 
For example, to export an instance of [https://github.com/ECF/grpc-RemoteServicesProvider/blob/master/examples/org.eclipse.ecf.examples.provider.grpc.helloworld.host/src/org/eclipse/ecf/examples/provider/grpc/helloworld/host/GreeterImpl.java GreeterImpl]
 
 
<pre>
 
// Set required OSGi standard service property
 
props.put("service.exported.interfaces","io.grpc.examples.helloworld.GreeterService");
 
// Set OSGI standard service.exported.configs property to ecf.grpc.server
 
props.put("service.exported.configs","ecf.grpc.server");
 
// Set ecf.grpc.server-specific properties
 
props.put("ecf.grcp.server.uriContext","http://myhost:51001");
 
// With service properties, will export as a remote service via an instance of ecf.grcp.server
 
bundleContext.registerService(io.grpc.examples.helloworld.GreeterService.class, new GreeterImpl(), props);
 
</pre>
 
 
Another example of how to register and export a remote service using Declarative Services' @Component annotations
 
<pre>
 
package org.eclipse.ecf.examples.provider.grpc.helloworld.host;
 
 
import io.grpc.examples.helloworld.HelloReply;
 
import io.grpc.examples.helloworld.HelloRequest;
 
 
import org.osgi.service.component.annotations.Component;
 
 
import io.grpc.examples.helloworld.GreeterGrpc.AbstractGreeter;
 
import io.grpc.examples.helloworld.GreeterService;
 
import io.grpc.stub.StreamObserver;
 
 
@Component(immediate = true, service = GreeterService.class, property = {
 
"service.exported.interfaces=io.grpc.examples.helloworld.GreeterService",
 
"service.exported.configs=ecf.grpc.server",
 
"ecf.grpc.server.uriContext=http://localhost:50001" })
 
public class GreeterImpl extends AbstractGreeter implements GreeterService {
 
 
@Override
 
public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
 
// Call synchronous version of method to get reply
 
HelloReply reply = sayHello(req);
 
responseObserver.onNext(reply);
 
responseObserver.onCompleted();
 
}
 
 
@Override
 
public HelloReply sayHello(HelloRequest req) {
 
// Respond with HelloReply with message "Hello there <name"
 
return HelloReply.newBuilder().setMessage("Hello there " + req.getName()).build();
 
}
 
}
 
</pre>
 
 
The entire project for this host example is [https://github.com/ECF/grpc-RemoteServicesProvider/tree/master/examples/org.eclipse.ecf.examples.provider.grpc.helloworld.host here] in the [https://github.com/ECF/grpc-RemoteServicesProvider grpc-RemoteServicesProvider repository].
 
 
===Bundles===
 
 
org.eclipse.ecf.provider.grpc<br>
 
 
===Dependencies===
 
'''org.eclipse.ecf.provider.grpc''':  ECF Core, RSAPI
 
 
===Download/Install===
 
 
A build of this provider is available in '''[https://github.com/ECF/grpc-RemoteServicesProvider/tree/master/bundles/org.eclipse.ecf.provider.grpc/build/]''' directory.
 
 
===Source Code===
 
 
[https://github.com/ECF ECF Github] Repo: [https://github.com/ECF/grpc-RemoteServicesProvider ECF Google RPC Provider Github Repo], Paths:<br>
 
'''org.eclipse.ecf.provider.grpc''': bundles/org.eclipse.ecf.provider.grcp<br>
 
 
If you would like to contribute to the build/releng or the coding for this provider, or engage the ECF committers for support or custom development, please [https://dev.eclipse.org/mailman/listinfo/ecf-dev join and post a note to that effect to the ecf-dev mailing list].
 
  
 
==[http://www.xmlrpc.com/ XML-RPC Provider]==
 
==[http://www.xmlrpc.com/ XML-RPC Provider]==
  
====OSGi Configuration Types/ECF Container Types====
+
====OSGi Configuration Types====
'''ecf.xmlrpc.server'''<br>
+
'''ecf.xmlrpc.server''', '''ecf.xmlrpc.client'''<br>
'''ecf.xmlrpc.client'''<br>
+
  
For example, to export an instance of TimeService
+
====[https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#i1693415 OSGi R7 Supported Intents]====
  
<pre>
+
'''osgi.async''', '''osgi.basic''', '''osgi.private''', '''osgi.confidential'''
// Set required OSGi standard service property
+
props.put("service.exported.interfaces","*");
+
// Set OSGI standard service.exported.configs property to ecf.xmlrpc.server
+
props.put("service.exported.configs","ecf.xmlrpc.server");
+
// Set optional ecf.xmlrpc.server-specific properties
+
props.put("ecf.xmlrpc.server.uriContext","http://myhost:51001");
+
props.put("ecf.xmlrpc.server.uriPath","/myxml-rpc");
+
// With service properties, will export as a remote service via an instance of ecf.xmlrpc.server
+
bundleContext.registerService(TimeService.class, new TimeServiceImpl(), props);
+
</pre>
+
  
 
===Bundles===
 
===Bundles===
  
 
org.eclipse.ecf.provider.xmlrpc<br>
 
org.eclipse.ecf.provider.xmlrpc<br>
 
===Dependencies===
 
'''org.eclipse.ecf.provider.xmlrpc''':  ECF Core, RSAPI, Apache commons logging >= 1.1.1
 
  
 
===Download/Install===
 
===Download/Install===
  
A build of this provider is available '''[https://github.com/ECF/XmlRpcProvider/releases]'''  
+
'''[https://github.com/ECF/XmlRpcProvider/releases]'''  
  
 
===Source Code===
 
===Source Code===
Line 162: Line 45:
 
'''org.eclipse.ecf.provider.xmlrpc''': bundles/org.eclipse.ecf.provider.xmlrpc<br>
 
'''org.eclipse.ecf.provider.xmlrpc''': bundles/org.eclipse.ecf.provider.xmlrpc<br>
  
If you would like to contribute to the build/releng or the coding for this provider, or engage the ECF committers for support or custom development, please [https://dev.eclipse.org/mailman/listinfo/ecf-dev join and post a note to that effect to the ecf-dev mailing list].
+
===Examples===
 +
 
 +
See hello example in released distribution and in source code under examples/
  
 
==Generic Provider==
 
==Generic Provider==
  
All the generic providers are based upon a tcp-based asynchronous messaging transport.
+
The generic providers are based upon tcp transport socket api.
  
===OSGi Configuration Types/ECF Container Types===
+
===OSGi Configuration Types===
'''ecf.generic.server'''<br>
+
'''ecf.generic.server''', '''ecf.generic.client''', '''ecf.generic.ssl.server''', '''ecf.generic.ssl.client'''<br>
'''ecf.generic.client'''<br>
+
'''ecf.generic.ssl.server'''<br>
+
'''ecf.generic.ssl.client'''<br>
+
  
For example, to export an instance of MyServiceImpl
+
====[https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#i1693415 OSGi R7 Supported Intents]====
  
<pre>
+
'''osgi.async''', '''osgi.basic''', '''osgi.private''', '''osgi.confidential'''
// Set required OSGi standard service property
+
props.put("service.exported.interfaces","*");
+
// Set OSGI standard service.exported.configs property to ecf.generic.server
+
props.put("service.exported.configs","ecf.generic.server");
+
// Set ecf.generic.server-specific properties
+
props.put("ecf.generic.server.port","2121");
+
props.put("ecf.generic.server.hostname","mycompanyhost.com");
+
// With service properties, will export as a remote service via an instance of ecf.generic.server
+
bundleContext.registerService(MyService.class, new MyServiceImpl(), props);
+
</pre>
+
  
 
[[ECF_Generic_Provider_Configuration_Properties#Remote_Service_Configuration_Properties |  See here ]] for a description for generic-provider-specific service properties such as ecf.generic.server.hostname, ecf.generic.server.port, etc.
 
[[ECF_Generic_Provider_Configuration_Properties#Remote_Service_Configuration_Properties |  See here ]] for a description for generic-provider-specific service properties such as ecf.generic.server.hostname, ecf.generic.server.port, etc.
Line 192: Line 64:
 
===Bundles===
 
===Bundles===
  
org.eclipse.ecf.provider<br>
+
org.eclipse.ecf.provider, org.eclipse.ecf.provider.remoteservice
org.eclipse.ecf.provider.remoteservice
+
 
+
===Dependencies===
+
'''org.eclipse.ecf.provider''':  [[#Remote_Services_API | ECF core]], org.eclipse.ecf.sharedobject<br>
+
'''org.eclipse.ecf.provider.remoteservice''': org.eclipse.ecf.provider, [[#Remote_Services_API | RSAPI]]
+
  
 
===Download/Install===
 
===Download/Install===
  
P2 Repo and Karaf Feature:  See [https://www.eclipse.org/ecf/downloads.php Download Page]<br>
+
See [https://www.eclipse.org/ecf/downloads.php Download Page]<br>
P2 Feature ID:  '''org.eclipse.ecf.provider.generic.remoteservice.feature'''<br>
+
<br>
+
Karaf Feature:  '''ecf-remoteservices-sdk''' and '''ecf-remoteservices-distprovider-generic''' in repos given on [[EIG:Install_into_Apache_Karaf |  Karaf Installation Page]]
+
  
 
===Source Code===
 
===Source Code===
Line 211: Line 75:
 
'''org.eclipse.ecf.provider''': framework/bundles/org.eclipse.ecf.provider<br>
 
'''org.eclipse.ecf.provider''': framework/bundles/org.eclipse.ecf.provider<br>
 
'''org.eclipse.ecf.provider.remoteservice''':  providers/bundles/org.eclipse.ecf.provider.remoteservice
 
'''org.eclipse.ecf.provider.remoteservice''':  providers/bundles/org.eclipse.ecf.provider.remoteservice
 +
 +
===Tutorials and Examples===
 +
 +
See [https://wiki.eclipse.org/Using_the_Bndtools_Remote_Services_Project_Templates using Bndtools project templates] or [https://wiki.eclipse.org/Tutorial:_Building_your_first_OSGi_Remote_Service Building your first OSGi Remote Service]
  
 
==r-OSGi Provider==
 
==r-OSGi Provider==
  
 
===OSGi Configuration Types/ECF Container Types===
 
===OSGi Configuration Types/ECF Container Types===
'''ecf.r_osgi.peer'''<br>
+
'''ecf.r_osgi.peer''', '''ecf.r_osgi.peer.ws'''  (see r-OSGi over Websockets below), '''ecf.r_osgi.peer.wss''' (see r-OSGi over Websockets below)<br>
'''ecf.r_osgi.peer.ws'''  (see r-OSGi over Websockets below)<br>
+
'''ecf.r_osgi.peer.wss''' (see r-OSGi over Websockets below)<br>
+
  
For example, to export an instance of MyServiceImpl
+
[[R-OSGi_Properties |  See here ]] for a description for rosgi-provider System properties.
  
<pre>
+
====[https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#i1693415 OSGi R7 Supported Intents]====
// Set required OSGi standard service property
+
props.put("service.exported.interfaces","*");
+
// Set OSGI standard service.exported.configs property to ecf.generic.server
+
props.put("service.exported.configs","ecf.r_osgi.peer");
+
// With service properties, will export as a remote service via an instance of ecf.generic.server
+
bundleContext.registerService(MyService.class, new MyServiceImpl(), props);
+
</pre>
+
  
[[R-OSGi_Properties |  See here ]] for a description for rosgi-provider System properties.
+
'''osgi.async''', '''osgi.basic''', '''osgi.private''', '''osgi.confidential'''
  
 
===Bundles===
 
===Bundles===
  
org.eclipse.ecf.provider.r_osgi<br>
+
org.eclipse.ecf.provider.r_osgi, ch.ethz.iks.r_osgi.remote<br>
ch.ethz.iks.r_osgi.remote<br>
+
 
+
===Dependencies===
+
'''ch.ethz.iks.r_osgi.remote''':  org.objectweb.asm<br>
+
'''org.eclipse.ecf.provider.r_osgi''':  ch.ethz.iks.r_osgi.remote, [[#Remote_Services_API | ECF core]], [[#Remote_Services_API | RSAPI]]<br>
+
  
 
===Download/Install===
 
===Download/Install===
  
P2 Repo and Karaf Feature:  See [https://www.eclipse.org/ecf/downloads.php Download Page]<br>
+
See [https://www.eclipse.org/ecf/downloads.php Download Page]<br>
P2 Feature ID:  '''org.eclipse.ecf.remoteservice.rosgi.feature'''<br>
+
<br>
+
Karaf Feature:  '''ecf-remoteservices-distprovider-rosgi''' in repos given on [[EIG:Install_into_Apache_Karaf |  Karaf Installation Page]]
+
  
 
===Source Code===
 
===Source Code===
Line 260: Line 111:
 
java_websocket:  bundles/java_websocket<br>
 
java_websocket:  bundles/java_websocket<br>
 
<br>
 
<br>
[http://hereandnow.wbur.org/2016/04/20/cape-kiwanda-safety Recent build of these bundles is available here]   
+
[https://github.com/ECF/ROSGI-Websockets-Provider Recent build of these bundles is available here]   
  
==JMS/ActiveMQ Provider==
+
==JMS/ActiveMQ Providers==
  
All the JMS/ActiveMQ providers are based upon the [https://en.wikipedia.org/wiki/Java_Message_Service Java Messaging Service] (JMS) specification version 1.1.
+
JMS/ActiveMQ providers are based upon the [https://en.wikipedia.org/wiki/Java_Message_Service Java Messaging Service] (JMS) specification version 1.1+.
  
 
===OSGi Configuration Types/ECF Container Types===
 
===OSGi Configuration Types/ECF Container Types===
Line 270: Line 121:
 
'''ecf.jms.activemq.tcp.client'''<br>
 
'''ecf.jms.activemq.tcp.client'''<br>
  
For example, to export an instance of MyServiceImpl
+
====[https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#i1693415 OSGi R7 Supported Intents]====
  
<pre>
+
'''osgi.async''', '''osgi.basic''', '''osgi.private'''
// Set required OSGi standard service property
+
props.put("service.exported.interfaces","*");
+
// Set OSGI standard service.exported.configs property to ecf.jms.activemq.tcp.manager
+
props.put("service.exported.configs","ecf.jms.activemq.tcp.manager");
+
// Set ecf.jms.activemq.tcp.manager-specific properties
+
props.put("ecf.jms.activemq.tcp.manager.id","tcp://localhost:61616/exampleTopic");
+
// With service properties, will export as a remote service via an instance of ecf.jms.activemq.tcp.manager
+
bundleContext.registerService(MyService.class, new MyServiceImpl(), props);
+
</pre>
+
  
 
===Bundles===
 
===Bundles===
Line 287: Line 129:
 
org.eclipse.ecf.provider.jms<br>
 
org.eclipse.ecf.provider.jms<br>
 
org.eclipse.ecf.provider.jms.activemq (based upon ActiveMQ 5.12 currently...see source code).
 
org.eclipse.ecf.provider.jms.activemq (based upon ActiveMQ 5.12 currently...see source code).
 
===Dependencies===
 
'''org.eclipse.ecf.provider.jms''':  javax.jms (1.1), [[#Remote_Services_API | ECF core]], [[#Remote_Services_API | RSAPI]], org.eclipse.ecf.provider, org.eclipse.ecf.provider.remoteservice<br>
 
'''org.eclipse.ecf.provider.jms.activemq''': org.eclipse.ecf.provider.jms
 
  
 
===Download/Install===
 
===Download/Install===
Line 301: Line 139:
 
'''org.eclipse.ecf.provider.jms''': bundles/org.eclipse.ecf.provider.jms<br>
 
'''org.eclipse.ecf.provider.jms''': bundles/org.eclipse.ecf.provider.jms<br>
 
'''org.eclipse.ecf.provider.jms.activemq''':  bundles/org.eclipse.ecf.provider.jms.activemq
 
'''org.eclipse.ecf.provider.jms.activemq''':  bundles/org.eclipse.ecf.provider.jms.activemq
 
If you would like to contribute to the build/releng or the coding for this provider, please [https://dev.eclipse.org/mailman/listinfo/ecf-dev join and post a note to that effect to the ecf-dev mailing list]. 
 
 
Note that the org.eclipse.ecf.provider.jms bundle contains most of the provider code, and that it only depends upon javax.jms.  This makes it straightforward to create new remote service providers based upon JMS implementations other than ActiveMQ.
 
  
 
==MQTT Provider (Paho)==
 
==MQTT Provider (Paho)==
Line 314: Line 148:
 
'''ecf.jms.mqtt.client'''<br>
 
'''ecf.jms.mqtt.client'''<br>
  
For example, to export an instance of MyServiceImpl
+
====[https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#i1693415 OSGi R7 Supported Intents]====
  
<pre>
+
'''osgi.async''', '''osgi.basic''', '''osgi.private'''
// Set required OSGi standard service property
+
props.put("service.exported.interfaces","*");
+
// Set OSGI standard service.exported.configs property to ecf.jms.mqtt.manager
+
props.put("service.exported.configs","ecf.jms.mqtt.manager");
+
// Set ecf.jms.mqtt.manager-specific properties
+
props.put("ecf.jms.mqtt.manager.id","tcp://iot.eclipse.org:1883/exampleTopic");
+
// With service properties, will export as a remote service via an instance of ecf.jms.mqtt.manager
+
bundleContext.registerService(MyService.class, new MyServiceImpl(), props);
+
</pre>
+
  
 
===Bundles===
 
===Bundles===
Line 336: Line 161:
 
===Download/Install===
 
===Download/Install===
  
A binary distribution of the Mqtt provider is available [https://github.com/ECF/Mqtt-Provider/releases here]
+
See [https://github.com/ECF/Mqtt-Provider/releases here]
  
 
===Source Code===
 
===Source Code===
Line 343: Line 168:
 
'''org.eclipse.ecf.provider.jms.mqtt''': bundles/org.eclipse.ecf.provider.jms.mqtt
 
'''org.eclipse.ecf.provider.jms.mqtt''': bundles/org.eclipse.ecf.provider.jms.mqtt
  
If you would like to contribute to the build/releng or the coding for this provider, please [https://dev.eclipse.org/mailman/listinfo/ecf-dev join and post a note to that effect to the ecf-dev mailing list].
+
==Jax-RS Providers==
 
+
==Jax-RS REST Providers==
+
  
 
The ECF team has created several REST-based Remote Service providers, all of which are based upon the Jax-RS specification.  By using OSGi Remote Service standards along with Jax-RS standards, it's possible to create remote services that can be used on any compliant Jax-RS implementation, and any RSA-compliant Remote Services implementation.  For a tutorial on how this can work, see [[Tutorial:_Using_REST_and_OSGi_Standards_for_Micro_Services  | the tutorial Using REST and OSGi Standards for Micro Services]].
 
The ECF team has created several REST-based Remote Service providers, all of which are based upon the Jax-RS specification.  By using OSGi Remote Service standards along with Jax-RS standards, it's possible to create remote services that can be used on any compliant Jax-RS implementation, and any RSA-compliant Remote Services implementation.  For a tutorial on how this can work, see [[Tutorial:_Using_REST_and_OSGi_Standards_for_Micro_Services  | the tutorial Using REST and OSGi Standards for Micro Services]].
Line 351: Line 174:
 
Since REST is based upon a client-server model of services, Remote Services based upon rest may only be exported on servers.  Clients may import, but are unable to export Remote Services.
 
Since REST is based upon a client-server model of services, Remote Services based upon rest may only be exported on servers.  Clients may import, but are unable to export Remote Services.
  
===Jackson Jax-RS Implementation===
+
===Jackson Jax-RS Distribution Provider===
  
 
====OSGi Configuration Types/ECF Container Types====
 
====OSGi Configuration Types/ECF Container Types====
Line 357: Line 180:
 
'''ecf.jaxrs.jersey.client'''<br>
 
'''ecf.jaxrs.jersey.client'''<br>
  
For example, to export an instance of MyServiceImpl
+
====[https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#i1693415 OSGi R7 Supported Intents]====
  
<pre>
+
'''osgi.async''', '''osgi.basic''', '''osgi.private''', '''osgi.confidential'''
// Set required OSGi standard service property
+
props.put("service.exported.interfaces","*");
+
// Set OSGI standard service.exported.configs property to ecf.jaxrs.jersey.server
+
props.put("service.exported.configs","ecf.jaxrs.jersey.server");
+
// Set ecf.jaxrs.jersey.server-specific properties
+
props.put("ecf.jaxrs.jersey.server.urlContext","http://myhost:8080");
+
props.put("ecf.jaxrs.jersey.server.alias","/myservice");  // corresponds to url context of:  http://myhost:8080/myservice
+
// With service properties, will export as a remote service via an instance of ecf.jaxrs.jersey.server
+
bundleContext.registerService(MyService.class, new MyServiceImpl(), props);
+
</pre>
+
  
 
====Bundles====
 
====Bundles====
Line 376: Line 189:
 
org.eclipse.ecf.provider.jaxrs.server<br>
 
org.eclipse.ecf.provider.jaxrs.server<br>
 
org.eclipse.ecf.provider.jaxrs
 
org.eclipse.ecf.provider.jaxrs
 
====Dependencies====
 
'''org.eclipse.ecf.provider.jersey.server''':  org.eclipse.ecf.provider.jaxrs.server, org.eclipse.ecf.provider.jaxrs, javax.ws.rs (Jax-RS 2.0.1 or greater), ECF Core, RSAPI, Jersey 2.14 or greater plus full extent of Jersey 2.14 dependencies with necessary addins (e.g. JSON, XML, etc).
 
  
 
====Download/Install====
 
====Download/Install====
Line 399: Line 209:
 
'''ecf.jaxrs.cxf.client'''<br>
 
'''ecf.jaxrs.cxf.client'''<br>
  
For example, to export an instance of MyServiceImpl
+
====[https://osgi.org/specification/osgi.cmpn/7.0.0/service.remoteservices.html#i1693415 OSGi R7 Supported Intents]====
  
<pre>
+
'''osgi.async''', '''osgi.basic''', '''osgi.private''', '''osgi.confidential'''
// Set required OSGi standard service property
+
props.put("service.exported.interfaces","*");
+
// Set OSGI standard service.exported.configs property to ecf.jaxrs.cxf.server
+
props.put("service.exported.configs","ecf.jaxrs.cxf.server");
+
// Set ecf.jaxrs.cxf.server-specific properties
+
props.put("ecf.jaxrs.cxf.server.urlContext","http://myhost:8080");
+
props.put("ecf.jaxrs.cxf.server.alias","/myservice");  // corresponds to url context of:  http://myhost:8080/myservice
+
// With service properties, will export as a remote service via an instance of ecf.jaxrs.cxf.server
+
bundleContext.registerService(MyService.class, new MyServiceImpl(), props);
+
</pre>
+
  
 
====Bundles====
 
====Bundles====
Line 418: Line 218:
 
org.eclipse.ecf.provider.jaxrs.server<br>
 
org.eclipse.ecf.provider.jaxrs.server<br>
 
org.eclipse.ecf.provider.jaxrs
 
org.eclipse.ecf.provider.jaxrs
 
====Dependencies====
 
'''org.eclipse.ecf.provider.jersey.server''':  org.eclipse.ecf.provider.jaxrs.server, org.eclipse.ecf.provider.jaxrs, javax.ws.rs (Jax-RS 2.0.1 or greater), ECF Core, RSAPI, CXF 3.1.2 or greater plus full extent of CXF 3.1.2 dependencies with necessary addins (e.g. JSON, XML, etc).
 
  
 
====Source Code====
 
====Source Code====
Line 428: Line 225:
 
'''org.eclipse.ecf.provider.jaxrs.server''': bundles/org.eclipse.ecf.provider.jaxrs.server<br>
 
'''org.eclipse.ecf.provider.jaxrs.server''': bundles/org.eclipse.ecf.provider.jaxrs.server<br>
 
'''org.eclipse.ecf.provider.jaxrs''':  bundles/org.eclipse.ecf.provider.jaxrs<br>
 
'''org.eclipse.ecf.provider.jaxrs''':  bundles/org.eclipse.ecf.provider.jaxrs<br>
 
If you would like to contribute to the build/releng or the coding for this provider, please [https://dev.eclipse.org/mailman/listinfo/ecf-dev join and post a note to that effect to the ecf-dev mailing list].
 
  
 
==Providers created via ECF REST API==
 
==Providers created via ECF REST API==
Line 439: Line 234:
  
 
As mentioned above, only REST servers may export Remote Services, so the ecf.rest.client provider may not export Remote Services.
 
As mentioned above, only REST servers may export Remote Services, so the ecf.rest.client provider may not export Remote Services.
 +
 +
==[https://github.com/ECF/kryo-serialization Kryo Serialization]==
 +
 +
This set of projects enhances the [https://wiki.eclipse.org/Distribution_Providers#Generic_Provider ECF generic providers] to use [https://github.com/EsotericSoftware/kryo Kryo serialization] rather than Java serialization.  [https://github.com/EsotericSoftware/kryo Kryo serialization] is a fast and efficient object serialization for Java.
 +
 +
See the example of usage and documentation described on the [https://github.com/ECF/kryo-serialization main Kryo serialization project page].
 +
 +
OSGi R7 Supported Intents:  None
 +
 +
===Bundles===
 +
 +
org.eclipse.ecf.provider.sharedobject.serializer.kryo<br>
 +
 +
===Dependencies===
 +
 +
'''org.eclipse.ecf.provider.sharedobject.serializer.kryo''':  ECF Core, RSAPI, [https://github.com/EsotericSoftware/kryo Kryo Serialization]
 +
 +
===Source Code===
 +
 +
[https://github.com/ECF ECF Github] Repo: [https://github.com/ECF/kryo-serialization Kryo Serialization for Generic Provider Github Repo], Paths:<br>
 +
'''org.eclipse.ecf.provider.sharedobject.serializer.kryo''': org.eclipse.ecf.sharedobject.serializer.kryo<br>
 +
 +
==[https://github.com/ECF/Py4j-RemoteServicesProvider Python OSGi Services Provider]==
 +
 +
Please see [[Tutorial: Python for OSGi Services]]
 +
 +
===Download/Install===
 +
 +
A binary build (p2) of this provider is available [https://github.com/ECF/Py4j-RemoteServicesProvider/releases here]
 +
 +
===Source Code===
 +
 +
[https://github.com/ECF ECF Github] Repo: [https://github.com/ECF/Py4j-RemoteServicesProvider ECF Python Provider Github Repo]
  
 
===Bundles===
 
===Bundles===

Revision as of 12:34, 11 June 2018

Contents

Introduction

New: ECF OSGi R7 Remote Services. The R7 Remote Services adds the standardization of several intents. One of those intents is the [osgi.async intent], which allows remote services to be invoked asynchronously (non-blocking) rather than synchronously (blocking). Supporting async and the other standardized intents: osgi.basic, osgi.private, osgi.confidential requires a distribution provider that supports that intent. For each distribution provider below, the currently supported intents are listed. To request support for an unsupported intent, please post the request to the ecf-dev mailing list.

The Remote Services/Remote Service Admin specifications (chaps 100 and 122 in OSGi Enterprise spec) allows for the use of multiple distribution providers. Distribution providers are responsible for the actual marshalling/serialization and network communication when a consumer invokes a remote service method.

The ECF Architecture also allows the use of multiple distribution providers. Further, ECF's open APIs and implementations supports the creation of custom distribution providers using any desired transport protocols, serialization formats and/or libraries.

Remote Services API

ECF's API for distribution providers is the Remote Services API (RSAPI). Implementing this API is the only thing required to create a RS/RSA standards compliant distribution provider.

Symbolic Name: org.eclipse.ecf.remoteservice
Minimum EE: J2SE-1.7+
Dependencies

  • Framework: OSGi R6+ (Equinox Mars+)
  • ECF Core Bundles: org.eclipse.ecf, org.eclipse.ecf.identity
  • org.eclipse.equinox.concurrent.future bundle
  • org.eclipse.ecf.remoteservice.asyncproxy bundle version 1.X (Java 7) or 2.X (Java 8)

Remote Service API Javadoc

All ECF RSA distribution providers implement the RSAPI.

XML-RPC Provider

OSGi Configuration Types

ecf.xmlrpc.server, ecf.xmlrpc.client

OSGi R7 Supported Intents

osgi.async, osgi.basic, osgi.private, osgi.confidential

Bundles

org.eclipse.ecf.provider.xmlrpc

Download/Install

[1]

Source Code

ECF Github Repo: ECF XML-RPC Provider Github Repo, Paths:
org.eclipse.ecf.provider.xmlrpc: bundles/org.eclipse.ecf.provider.xmlrpc

Examples

See hello example in released distribution and in source code under examples/

Generic Provider

The generic providers are based upon tcp transport socket api.

OSGi Configuration Types

ecf.generic.server, ecf.generic.client, ecf.generic.ssl.server, ecf.generic.ssl.client

OSGi R7 Supported Intents

osgi.async, osgi.basic, osgi.private, osgi.confidential

See here for a description for generic-provider-specific service properties such as ecf.generic.server.hostname, ecf.generic.server.port, etc.

Bundles

org.eclipse.ecf.provider, org.eclipse.ecf.provider.remoteservice

Download/Install

See Download Page

Source Code

Git Repo: ECF Git Repo, Paths:
org.eclipse.ecf.provider: framework/bundles/org.eclipse.ecf.provider
org.eclipse.ecf.provider.remoteservice: providers/bundles/org.eclipse.ecf.provider.remoteservice

Tutorials and Examples

See using Bndtools project templates or Building your first OSGi Remote Service

r-OSGi Provider

OSGi Configuration Types/ECF Container Types

ecf.r_osgi.peer, ecf.r_osgi.peer.ws (see r-OSGi over Websockets below), ecf.r_osgi.peer.wss (see r-OSGi over Websockets below)

See here for a description for rosgi-provider System properties.

OSGi R7 Supported Intents

osgi.async, osgi.basic, osgi.private, osgi.confidential

Bundles

org.eclipse.ecf.provider.r_osgi, ch.ethz.iks.r_osgi.remote

Download/Install

See Download Page

Source Code

Git Repo: ECF Git Repo, Paths:
ch.ethz.iks.r_osgi.remote: protocols/bundles/ch.ethz.iks.r_osgi.remote
org.eclipse.ecf.provider.remoteservice: providers/bundles/org.eclipse.ecf.provider.r_osgi

r-OSGi over Websockets

The two r-OSGi providers: ecf.r_osgi.peer.ws, and ecf.r_osgi.peer.wss are supported by adding two additional bundles: ch.ethz.iks.r_osgi.transport.http, and Java Websocket. These two bundles are available in the ECF Github Websockets Repo, at the following paths:
ch.ethz.iks.r_osgi.transport.http: bundles/ch.ethz.iks.r_osgi.transport.http
java_websocket: bundles/java_websocket

Recent build of these bundles is available here

JMS/ActiveMQ Providers

JMS/ActiveMQ providers are based upon the Java Messaging Service (JMS) specification version 1.1+.

OSGi Configuration Types/ECF Container Types

ecf.jms.activemq.tcp.manager
ecf.jms.activemq.tcp.client

OSGi R7 Supported Intents

osgi.async, osgi.basic, osgi.private

Bundles

org.eclipse.ecf.provider.jms
org.eclipse.ecf.provider.jms.activemq (based upon ActiveMQ 5.12 currently...see source code).

Download/Install

Binary for the JMS provider, along with Karaf feature spec is available here

Source Code

ECF Github Repo: ECF JMS Github Repo, Paths:
org.eclipse.ecf.provider.jms: bundles/org.eclipse.ecf.provider.jms
org.eclipse.ecf.provider.jms.activemq: bundles/org.eclipse.ecf.provider.jms.activemq

MQTT Provider (Paho)

The ECF team has created a Remote Service provider based upon the MQTT3 Paho implementation. We are currently using Paho version 1.0.2.

OSGi Configuration Types/ECF Container Types

ecf.jms.mqtt.manager
ecf.jms.mqtt.client

OSGi R7 Supported Intents

osgi.async, osgi.basic, osgi.private

Bundles

org.eclipse.ecf.provider.jms.mqtt

Dependencies

org.eclipse.ecf.provider.jms.mqtt: org.eclipse.ecf.provider.jms from JMS/ActiveMQ Provider above.

Download/Install

See here

Source Code

ECF Github Repo: ECF MQTT Provider Github Repo, Paths:
org.eclipse.ecf.provider.jms.mqtt: bundles/org.eclipse.ecf.provider.jms.mqtt

Jax-RS Providers

The ECF team has created several REST-based Remote Service providers, all of which are based upon the Jax-RS specification. By using OSGi Remote Service standards along with Jax-RS standards, it's possible to create remote services that can be used on any compliant Jax-RS implementation, and any RSA-compliant Remote Services implementation. For a tutorial on how this can work, see the tutorial Using REST and OSGi Standards for Micro Services.

Since REST is based upon a client-server model of services, Remote Services based upon rest may only be exported on servers. Clients may import, but are unable to export Remote Services.

Jackson Jax-RS Distribution Provider

OSGi Configuration Types/ECF Container Types

ecf.jaxrs.jersey.server
ecf.jaxrs.jersey.client

OSGi R7 Supported Intents

osgi.async, osgi.basic, osgi.private, osgi.confidential

Bundles

org.eclipse.ecf.provider.jersey.server
org.eclipse.ecf.provider.jaxrs.server
org.eclipse.ecf.provider.jaxrs

Download/Install

A binary distribution of the Jersey client and server is available here

Source Code

ECF Github Repo: ECF JaxRS Providers Github Repo, Paths:
org.eclipse.ecf.provider.jersey.server: bundles/org.eclipse.ecf.provider.jersey.server
org.eclipse.ecf.provider.jaxrs.server: bundles/org.eclipse.ecf.provider.jaxrs.server
org.eclipse.ecf.provider.jaxrs: bundles/org.eclipse.ecf.provider.jaxrs

If you would like to contribute to the build/releng or the coding for this provider, please join and post a note to that effect to the ecf-dev mailing list.

Apache CXF Jax-RS Implementation

OSGi Configuration Types/ECF Container Types

ecf.jaxrs.cxf.server
ecf.jaxrs.cxf.client

OSGi R7 Supported Intents

osgi.async, osgi.basic, osgi.private, osgi.confidential

Bundles

org.eclipse.ecf.provider.cxf.server
org.eclipse.ecf.provider.jaxrs.server
org.eclipse.ecf.provider.jaxrs

Source Code

ECF Github Repo: ECF JaxRS Providers Github Repo, Paths:
org.eclipse.ecf.provider.cxf.server: bundles/org.eclipse.ecf.provider.cxf.server
org.eclipse.ecf.provider.jaxrs.server: bundles/org.eclipse.ecf.provider.jaxrs.server
org.eclipse.ecf.provider.jaxrs: bundles/org.eclipse.ecf.provider.jaxrs

Providers created via ECF REST API

ECF has provided an API to aid in the creation of REST-based Remote Services provider. Using this API, it's possible to create a Remote Service client/proxy that uses an existing REST-based service. Thus new Remote Services can be created to expose an existing REST-based service. The following tutorial: ECF Remote Services for Accessing Existing REST Services describes how to use the ECF REST API to create client provider to access an existing REST service.

OSGi Configuration Types/ECF Container Types

ecf.rest.client

As mentioned above, only REST servers may export Remote Services, so the ecf.rest.client provider may not export Remote Services.

Kryo Serialization

This set of projects enhances the ECF generic providers to use Kryo serialization rather than Java serialization. Kryo serialization is a fast and efficient object serialization for Java.

See the example of usage and documentation described on the main Kryo serialization project page.

OSGi R7 Supported Intents: None

Bundles

org.eclipse.ecf.provider.sharedobject.serializer.kryo

Dependencies

org.eclipse.ecf.provider.sharedobject.serializer.kryo: ECF Core, RSAPI, Kryo Serialization

Source Code

ECF Github Repo: Kryo Serialization for Generic Provider Github Repo, Paths:
org.eclipse.ecf.provider.sharedobject.serializer.kryo: org.eclipse.ecf.sharedobject.serializer.kryo

Python OSGi Services Provider

Please see Tutorial: Python for OSGi Services

Download/Install

A binary build (p2) of this provider is available here

Source Code

ECF Github Repo: ECF Python Provider Github Repo

Bundles

org.eclipse.ecf.remoteservice.rest

Dependencies

org.eclipse.ecf.remoteservice.rest: ECF core, Apache HttpClient v4.3 or higher.

Download/Install

P2 Repo and Karaf Feature: See Download Page
P2 Feature ID: org.eclipse.ecf.remoteservice.rest.feature

Karaf Feature: ecf-remoteservices-rest in repos given on Karaf Installation Page

Source Code

Git Repo: ECF Git Repo, Paths:
org.eclipse.ecf.remoteservice.rest: framework/bundles/org.eclipse.ecf.remoteservice.rest

Hazelcast Provider

OSGi Configuration Types/ECF Container Types

ecf.jms.hazelcast.manager
ecf.jms.hazelcast.member

For example, to export an instance of MyServiceImpl

// Set required OSGi standard service property
props.put("service.exported.interfaces","*");
// Set OSGI standard service.exported.configs property to ecf.jms.hazelcast.manager
props.put("service.exported.configs","ecf.jms.hazelcast.manager");
// Set ecf.jms.hazelcast.manager-specific properties
props.put("ecf.jms.hazelcast.manager.id","hazelcast://localhost/exampleTopic");
// With service properties, will export as a remote service via an instance of ecf.jms.hazelcast.manager
bundleContext.registerService(MyService.class, new MyServiceImpl(), props);

Bundles

org.eclipse.ecf.provider.jms.hazelcast

Dependencies

org.eclipse.ecf.provider.jms.hazelcast: org.eclipse.ecf.provider.jms from JMS provider above, ECF Core, RSAPI

Download/Install

A binary build of hte Hazelcast distribution provider is available here

Source Code

ECF Github Repo: ECF Hazelcast Provider Github Repo, Paths:
org.eclipse.ecf.provider.jms.hazelcast: bundles/org.eclipse.ecf.provider.jms.hazelcast

If you would like to contribute to the build/releng or the coding for this provider, please join and post a note to that effect to the ecf-dev mailing list.

JavaGroups (JGroups) Provider

OSGi Configuration Types/ECF Container Types

ecf.jgroups.manager
ecf.jgroups.client

For example, to export an instance of MyServiceImpl

// Set required OSGi standard service property
props.put("service.exported.interfaces","*");
// Set OSGI standard service.exported.configs property to ecf.jgroups.manager
props.put("service.exported.configs","ecf.jgroups.manager");
// Set ecf.jgroups.manager-specific properties defined in JGroupsManagerContainer class
props.put("ecf.jgroups.manager.managerId","jgroups:mygroupname");
// With service properties, will export as a remote service via an instance of ecf.jgroups.manager
bundleContext.registerService(MyService.class, new MyServiceImpl(), props);

Bundles

org.eclipse.ecf.provider.jgroups

Dependencies

org.eclipse.ecf.provider.jgroups: org.jgroups (3.6.8.Final or more recent), ECF Core, RSAPI, org.eclipse.ecf.provider, org.eclipse.ecf.provider.remoteservice, org.eclipse.ecf.sharedobject

Download/Install

A build of this provider is available here

Source Code

ECF Github Repo: ECF JavaGroups Provider Github Repo, Paths:
org.eclipse.ecf.provider.jgroups: bundles/org.eclipse.ecf.provider.jgroups

If you would like to contribute to the build/releng or the coding for this provider, please join and post a note to that effect to the ecf-dev mailing list.

Back to the top