[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [ecf-dev] Distributing hello world example

Hi Ronen,

On 3/28/2011 5:33 AM, ronen hamias wrote:
Hi Scott and thanks for the help
 
i am using ECF on the server since i do not have client side i am using ECF as (server side) service communication framework based on OSGi
i have changed the port as suggested and got the following error:
 <stuff deleted>

it seem that this line of code returns null:
 

// 3. Lookup IRemoteServiceReference

IRemoteServiceReference[] helloReferences = containerAdapter.getRemoteServiceReferences(IDFactory.getDefault().createID(

container.getConnectNamespace(), ROSGI_SERVICE_HOST),IHello.class.getName(), null);

my consumer service cannot locate my services


Right.  So it *looks* like there is still something wrong with the value of the ROSGI_SERVICE_HOST or DEFAULT_CONTAINER_ID.  They need to both be equal to  "r-osgi://localhost:9278"

Also...is it possible that the service host is not registered before the client tries to connect?  (i.e. you are setting up a race, where the consumer connects and tries to access the host before the service host registration completes?

A third possibility:  the *package* of your service interface (IHello) must be exported.  If you have created your own/new IHello, in your own/new package, then you should make sure that that package is exported.

Further...I would suggest that you start from a codebase that is known to work...e.g. the hello examples.  If you must call getRemoteServiceReferences directly in your code (rather than using the OSGi remote services...which does this automatically for you...and I would suggest using), then I would suggest starting from these two example projects...as they are known to work just fine:

org.eclipse.ecf.examples.remoteservices.hello.host.rs   (hello host example using remote services api directly)
org.eclipse.ecf.examples.remoteservices.hello.consumer.rs (hello consumer example using remote services api directly)

It looks from your code that you have already consulted these projects...so are you able to locally start/run the products in:

/org.eclipse.ecf.examples.remoteservices.hello.host.rs/products/Hello Service Host RS.product
(for host)

org.eclipse.ecf.examples.remoteservices.hello.consumer.rs/products/Hello Service Consumer RS.product
(for consumer)

?

Hope this helps.

Scott


i guess i am missing somthing

please advise


Ronen
On Sun, Mar 27, 2011 at 5:30 PM, Scott Lewis <slewis@xxxxxxxxxxxxx> wrote:
Hi Ronen,


On 3/27/2011 6:34 AM, ronen hamias wrote:
Hi All,

i am trying to distribute simple hello world implementation

when i invoke my client i get this error:
<

It looks to me from the stack traces that the client cannot connect to the service host.  This could be because

a) the service host is not exporting correctly,
b) the client is trying to access the incorrect host/port;

Basically, the client/consumer is saying that it can't reach the host it's trying to reach.



my client source code looks like this:
----------------------------------------------------------------------------------------------------------------------------------------------------------
package pt.hello.client;

import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.IContainerManager;
import org.eclipse.ecf.core.identity.IDFactory;

import org.eclipse.ecf.remoteservice.IRemoteCall;
import org.eclipse.ecf.remoteservice.IRemoteCallListener;
import org.eclipse.ecf.remoteservice.IRemoteService;
import org.eclipse.ecf.remoteservice.IRemoteServiceContainerAdapter;
import org.eclipse.ecf.remoteservice.IRemoteServiceReference;
import org.eclipse.ecf.remoteservice.events.IRemoteCallCompleteEvent;
import org.eclipse.ecf.remoteservice.events.IRemoteCallEvent;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;

import pt.hello.IHello;

/**
 * The activator class controls the plug-in life cycle
 */
public class Activator implements BundleActivator {

   public static final String ROSGI_SERVICE_HOST = "r-osgi://localhost:9279";

   private BundleContext context;
   private ServiceTracker containerManagerServiceTracker;
   private IContainer container;

   /*
    * (non-Javadoc)
    *
    * @see
    * org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
    */
   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
       proxy.hello("RemoteService Consumer");
   }


   IRemoteCall createRemoteCall() {
       return new IRemoteCall() {

           public String getMethod() {
               return "hello";
           }

           public Object[] getParameters() {
               return new Object[] { "Asynch RemoteService Consumer" };
           }

           public long getTimeout() {
               return 0;
           }
       };
   }

   IRemoteCallListener createRemoteCallListener() {
       return new IRemoteCallListener() {

           public void handleEvent(IRemoteCallEvent event) {
               if (event instanceof IRemoteCallCompleteEvent) {
                   IRemoteCallCompleteEvent cce = (IRemoteCallCompleteEvent) event;
                   if (!cce.hadException())
                       System.out
                               .println("Remote call completed successfully!");
                   else
                       System.out
                               .println("Remote call completed with exception: "
                                       + cce.getException());
               }
           }
       };
   }

   /*
    * (non-Javadoc)
    *
    * @see
    * org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
    */
   public void stop(BundleContext context) throws Exception {
       if (container != null) {
           container.disconnect();
           container = null;
       }
       if (containerManagerServiceTracker != null) {
           containerManagerServiceTracker.close();
           containerManagerServiceTracker = null;
       }
       this.context = null;
   }

   private IContainerManager getContainerManagerService() {
       if (containerManagerServiceTracker == null) {
           containerManagerServiceTracker = new ServiceTracker(context,
                   IContainerManager.class.getName(), null);
           containerManagerServiceTracker.open();
       }
       return (IContainerManager) containerManagerServiceTracker.getService();
   }

}
----------------------------------------------------------------------------------------------------------------------------------------------------------
my server side source code looks like this:
----------------------------------------------------------------------------------------------------------------------------------------------------------

package pt.hello.service;


import java.util.Properties;

import org.eclipse.ecf.osgi.services.distribution.IDistributionConstants;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;

import pt.hello.IHello;

public class Activator implements BundleActivator{
   private static final String containerType = "ecf.r_osgi.peer";
   public static final String DEFAULT_CONTAINER_ID = "r-osgi://localhost:9279";
   private String containerId = DEFAULT_CONTAINER_ID;
   private ServiceRegistration helloRegistration;

   /*
    * (non-Javadoc)
    * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
    */
   @Override
   public void start(BundleContext context) throws Exception{
       registerHelloRemoteService(context);
       System.out.println("IHello RemoteService registered");
   }

   void registerHelloRemoteService(BundleContext context) {
       // Setup properties for remote service distribution, as per OSGi 4.2
       // remote services
       // specification (chap 13 in compendium spec)
       Properties props = new Properties();
       // add OSGi service property indicated export of all interfaces exposed
       // by service (wildcard)
       props.put(IDistributionConstants.SERVICE_EXPORTED_INTERFACES,
               IDistributionConstants.SERVICE_EXPORTED_INTERFACES_WILDCARD);
       // add OSGi service property specifying config
       props.put(IDistributionConstants.SERVICE_EXPORTED_CONFIGS,
               containerType);
       // add ECF service property specifying container factory args
       props.put(
               IDistributionConstants.SERVICE_EXPORTED_CONTAINER_FACTORY_ARGUMENTS,
               containerId);
       // register remote service
       helloRegistration = context.registerService(
               IHello.class.getName(), new HelloImpl(), props);
       // tell everyone
       System.out.println("Host: Hello Service Registered");
   }

   void unregisterHelloRemoteService() {
       if (helloRegistration != null) {
           helloRegistration.unregister();
           helloRegistration = null;
       }
       // tell everyone
       System.out.println("Host: Hello Remote Service Unregistered");
   }

   /*
    * (non-Javadoc)
    * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
    */
   @Override
   public void stop(BundleContext context) throws Exception{}
}

i guess i am missing somthing... can someone direct me what i am doing wrong?

Well, it looks to me as if you are exporting the service with the wrong/incorrect endpoint it.  That is, when you start the service host app (I assume you are starting it first), r-osgi will use port *9278*, but because you use this:


  public static final String DEFAULT_CONTAINER_ID = "r-osgi://localhost:9279";

The endpoint will be exported with endpoint id = "r-osgi://localhost:9279".   And when the client attempts to connect to r-osgi://localhost:9279 it fails (because the service host is listening on 9278).

It is possible to tell the r-osgi provider to use a specific port (e.g. 9279)...but because r-osgi existed prior to ECF's usage as a remote services provider this is done via system properties.  These r-OSGi-specific properties are described here

http://wiki.eclipse.org/R-OSGi_Properties

Hope this helps.

Incidently...why are you using the OSGi remote services on the host, but not on the client?  You can do this, but it makes the client more complicated (i.e. the need for all the code that uses the ECF remote services API directly...e.g. containerAdapter.getRemoteReferences(...), etc).

Scott


_______________________________________________
ecf-dev mailing list
ecf-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/ecf-dev



--
Ronen Hamias
Cell Phone: +972-50-2289988
_______________________________________________ ecf-dev mailing list ecf-dev@xxxxxxxxxxx https://dev.eclipse.org/mailman/listinfo/ecf-dev