You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@river.apache.org by Gregg Wonderly <gr...@wonderly.org> on 2008/12/12 19:57:28 UTC
Service lookup without unmarshalling - details
Wade Chandler wrote:
> Heh heh, yes, there needs to be a way to inspect the service, some credentials,
> without unmarshalling. A way to ask for all services out there, the class or
> interface they implement, along with other user identification information such
> as a displayable name, description, version, etc I would think. What about this
> list? Anyone have a link to an archive? I want to find your other email Gregg
> and see what you wrote about there.
I was just in my list of things I still wanted to put back into River. I did
this about 2-3 years ago, and have been using it since then. The Reggie
architecture makes it easy to do. I want it to be an optional interface
supported by lookup services.
As an example, the current definition of lookup(ServiceTemplate,int) in the
Reggie proxy is shown here.
// Inherit javadoc
public ServiceMatches lookup(ServiceTemplate tmpl, int maxMatches)
throws RemoteException
{
return server.lookup(new Template(tmpl), maxMatches).get();
}
If you look closely, you will see the "get()" on the end of the line, above,
which does the unmarshalling. So, just before it gives you the results, they
are unmarshalled.
The following method is one of the ones that I added which is in the
ServiceLookup interface API.
public RemoteIterator<ServiceEntry> lookupEntries( ServiceTemplate tmpl,
int maxMatches ) throws RemoteException {
return new LocalEntryIterator( server.lookup(new Template(tmpl),
maxMatches ) );
}
So, it's possible for Reggie to have a simple conversion done to provide this
capability. However, I don't think it's realistic to ask that all
ServiceRegistrar instances support this as the Primary mechanism.
What I've done so far, works. Are the names and relationships exactly what I'd
want to see in a production system? Perhaps not. Below is an example usage of
the API.
If you had a ServiceRegistrar instance which also implemented ServiceLookup,
you'd do something like the following to perform a lookup and get a name for all
the service instances and add them to a list via addService().
// make sure no downloading occurs to resolve these classes
ClassLoading.neverPrefer( Name.class );
ClassLoading.neverPrefer( ServiceInfo.class );
ServiceTemplate tmpl = ...
ServiceRegistrar reg = ...
if( reg instanceof ServiceLookup ) {
ServiceLookup lu = (ServiceLookup)reg;
RemoteIterator<ServiceEntry> ents = lu.lookupEntries( tmpl );
for( ServiceEntry ent : ents ) {
Set<ServiceDataAccess<Entry>> accs =
ent.getMarshalledAttributeSets();
String name = null;
for( ServiceDataAccess<Entry> entacc : accs ) {
if( entacc.getDataClassNames().
contains(Name.class.getName() ) {
// Will resolve to local VM class
name = ((Name)entacc.getData()).getName();
// Prefer Name, but allow ServiceInfo
} else if( entacc.getDataClassNames().
contains(ServiceInfo.class.getName() &&
name == null ) {
// Will resolve to local VM class
name = ((ServiceInfo)
entacc.getData()).getName();
}
}
if( name == null )
name = ...find a name from classes...
addService( name, ent );
}
} else {
// you can do regular lookup here and get live objects, or
// you can ignore all instances that don't support
// access to the marhalled results.
}
So in this case, only the Entry values for a Name instance of a ServiceInfo
instance will ever be instantiated. My changes to ClassLoading, to provide the
ability to short circuit PreferredClassLoader from downloading the first jar in
the codebase to find the PREFERRED.LIST to see how to resolve the classes being
unmarshalled, keep unneeded code from being unmarshalled. Imagine what would
happen to your VM where 200 developers are working on the same project, all
running netbeans, and using a service proxy that unmarshalls into a 1MB class
instance. Suddenly, you do a lookup and 200MB goes aways!
Nicalas, and others desires to have a no-network environment could help deal
with some of the issues of rogue code. At some point, you will want to not have
all of the services running on your computer when you are testing a client. You
might in fact not be able to run the server on your computer. Both network and
non-network environments are interesting to explore. My investigation into
these issues and how to get away from downloading anything, until you use it,
has been very revealing of the issues to me.
Gregg Wonderly