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:
org.osgi.framework.BundleException
: Exception in pt.hello.client.Activator.start() of bundle pt.hello.client.
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(
BundleContextImpl.java:1018)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(
BundleContextImpl.java:974)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(
BundleHost.java:346)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(
AbstractBundle.java:260)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(
AbstractBundle.java:252)
at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._start(
FrameworkCommandProvider.java:260)
at sun.reflect.NativeMethodAccessorImpl.invoke0(
Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.execute(
FrameworkCommandInterpreter.java:145)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(
FrameworkConsole.java:294)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.console(
FrameworkConsole.java:279)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(
FrameworkConsole.java:214)
at java.lang.Thread.run(Unknown Source)
Caused by:
org.eclipse.core.runtime.AssertionFailedException: null argument:
at org.eclipse.core.runtime.Assert.isNotNull(
Assert.java:85)
at org.eclipse.core.runtime.Assert.isNotNull(
Assert.java:73)
at pt.hello.client.Activator.start(
Activator.java:52)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(
BundleContextImpl.java:999)
at java.security.AccessController.doPrivileged(
Native Method)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(
BundleContextImpl.java:993)
... 14 more
Nested Exception:
org.eclipse.core.runtime.AssertionFailedException
: null argument:
at org.eclipse.core.runtime.Assert.isNotNull(
Assert.java:85)
at org.eclipse.core.runtime.Assert.isNotNull(
Assert.java:73)
at pt.hello.client.Activator.start(
Activator.java:52)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(
BundleContextImpl.java:999)
at java.security.AccessController.doPrivileged(
Native Method)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(
BundleContextImpl.java:993)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(
BundleContextImpl.java:974)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(
BundleHost.java:346)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(
AbstractBundle.java:260)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(
AbstractBundle.java:252)
at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._start(
FrameworkCommandProvider.java:260)
at sun.reflect.NativeMethodAccessorImpl.invoke0(
Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.execute(
FrameworkCommandInterpreter.java:145)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(
FrameworkConsole.java:294)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.console(
FrameworkConsole.java:279)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(
FrameworkConsole.java:214)
at java.lang.Thread.run(Unknown Source)
Nested Exception:
org.eclipse.core.runtime.AssertionFailedException
: null argument:
at org.eclipse.core.runtime.Assert.isNotNull(
Assert.java:85)
at org.eclipse.core.runtime.Assert.isNotNull(
Assert.java:73)
at pt.hello.client.Activator.start(
Activator.java:52)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(
BundleContextImpl.java:999)
at java.security.AccessController.doPrivileged(
Native Method)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(
BundleContextImpl.java:993)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(
BundleContextImpl.java:974)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(
BundleHost.java:346)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(
AbstractBundle.java:260)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(
AbstractBundle.java:252)
at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._start(
FrameworkCommandProvider.java:260)
at sun.reflect.NativeMethodAccessorImpl.invoke0(
Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.osgi.framework.internal.core.FrameworkCommandInterpreter.execute(
FrameworkCommandInterpreter.java:145)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand(
FrameworkConsole.java:294)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.console(
FrameworkConsole.java:279)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(
FrameworkConsole.java:214)
at java.lang.Thread.run(Unknown Source)
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
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