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
|