Hi Scott,
Hi Franck,
Franck Gasnier wrote:
I have a problem of initialization with the
getRemoteServiceReferences.
I am playing with Eclipse 3.3 and ECF 1.1.
Here are my plugins :
- Plugin1 :
- start the server in a startup extension
ID serverID =
IDFactory.getDefault().createStringID("ecftcp://localhost:3282/server");
Object[] args = new Object[] { serverID };
server = ContainerFactory.getDefault().createContainer("
ecf.generic.server", args);
- defines the IConcat interface (the interface of the service that
will be published
- Plugin2 :
- depends on Plugin1
- publishes a service in an action extension
IContainer clientOne =
ContainerFactory.getDefault().createContainer("ecf.generic.client");
ID serverID =
IDFactory.getDefault().createStringID("ecftcp://localhost:3282/server");
clientOne.connect(serverID, null);
IRemoteServiceContainerAdapter remoteContainerOne =
(IRemoteServiceContainerAdapter)
clientOne.getAdapter(IRemoteServiceContainerAdapter.class);
IRemoteServiceRegistration remoteServiceRegistration =
remoteContainerOne.registerRemoteService(new String[] {
IConcat.class.getName() }, new ConcatImpl(), null);
- Plugin3:
- depends on Plugin1
- in an action extension, look for the published service and call it
IContainer clientTwo =
ContainerFactory.getDefault().createContainer("ecf.generic.client");
ID serverID =
IDFactory.getDefault().createStringID("ecftcp://localhost:3282/server");
clientTwo.connect(serverID, null);
IRemoteServiceContainerAdapter remoteContainerTwo =
(IRemoteServiceContainerAdapter)
clientTwo.getAdapter(IRemoteServiceContainerAdapter.class);
Thread.sleep (1000);
IRemoteServiceReference[] refs =
remoteContainerTwo.getRemoteServiceReferences(null, null, null);
if (refs.length==0) {
System.out.println("Service not found");
return;
}
IRemoteService remoteService =
remoteContainerTwo.getRemoteService(refs[0]);
IConcat remoteConcat=(IConcat)remoteService.getPoxy();
String result = remoteConcat.concat
("Eclipse "," is cool");
System.out.println("TEST RESULT (asynch): " + result);
If I put these 3 plugins inside 1 Eclipse, everything works fine, I can
publish and call the service.
But when I put in 1 Eclipse Plugin1 and 2 and in another Eclipse
Plugin1 and 3 then
the first call to the service always returns "service not found", ie
getRemoteServiceReferences returns an empty array.
Then following calls works fine.
As a workaround I have added inside Plugin1 startup extension the
creation of an useless client :
ID serverID =
IDFactory.getDefault().createStringID("ecftcp://localhost:3282/server");
IContainer client =
ContainerFactory.getDefault().createContainer("ecf.generic.client");
client.connect(serverID, null);
IRemoteServiceContainerAdapter remoteContainerTwo =
(IRemoteServiceContainerAdapter)
client.getAdapter(IRemoteServiceContainerAdapter.class);
IRemoteServiceReference[] refs =
remoteContainerTwo.getRemoteServiceReferences(null, null, null);
client.disconnect();
Is there something that I missed ? An "init" method ? Or is it a bug ?
I'm not sure yet.
You say that in your second client (the 'client' of the service) you
make this call:
IRemoteServiceReference[] refs =
remoteContainerTwo.getRemoteServiceReferences(null, null, null);
But the getRemoteServiceReference method requires a non-null
value for the second parameter...so it probably should be (and maybe
is):
IRemoteServiceReference[] refs =
remoteContainerTwo.getRemoteServiceReferences(null,
IConcat.getClass().getName(), null);
Actually, I'm unclear on how
a call to getRemoteServiceReferences(null, null, null) could work. The
impl always returns an empty array if the second parameter is null.
I have tried both and traced the code. And this works fine. I
mean if the second parameter is null then it returns all registered
services.
But the first time, it is empty.
Anyway you are rigth I am looking for some IConcat services.
But assuming that you do have
the IConcat class in the code, then your problem is something else.
You say above that the plugin 1 is started via 'startup' extension...is
this the ECF startup extension or some other? Also...you say that
plugin 2 and plugin 3 are started via action extension...I assume that
you always run the plugin 2 action before plugin 3 in tests.
By startup, I mean the startup from org.eclipse.ui, not the one
from ECF.
This is just to prevent me from launching the server thru an
action.
Doing this raizes an Exception when I launch the 2d eclipse, but
I don't care for now.
I didn't yet look for a method to test if the server is already
running. But that is not the point there.
Plugin2 and Plugin3 start when I use the actions and Eclipse
stops them when I quit.
I will handle the disconnect later and the registration of the
clients container later.
This is just my first cup of ECF.
Would you be willing to make
these projects available to us? and I'll try running in my workspace to
see if we can diagnose the issue further?
I attached the archive with the 3 plugins.
You just have to import them thru : Import > Existing
projects
You will get the 3 plugins I was talking about.
To reproduce the problem :
- launch an eclipse with plugin1 and 2, in the menu ECF test do
"publish"
- launch an eclipse with plugin1 and 3, in the menu ECF test do
"call"
-> the first time you will get the message "service not found"
-> the 2d time you will get the "Eclipse is cool"
To enable my workaround, just uncomment in the Startup class in
the earlyStartup() method the call to init().
Then you will not get the "service not found".
Thanks
Franck
_______________________________________________
ecf-dev mailing list
ecf-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/ecf-dev
_______________________________________________
ecf-dev mailing list
ecf-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/ecf-dev