[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| [ecf-dev] Re: pub sub example and distributed OSGI service registry | 
with the remote service:  1) IRemoteService.callSynch(...): which  
would provide blocking call/return semantics; 2)  
IRemoteService.callAsynch(...) (either one) which sends a message  
to remote service, and either uses polling (AsynchResult) or  
notification to receive a return value; and 3) IRemoteService.fire 
(...): which would simply send a one-way message to invoke the  
remote service but not expect or wait for a return value.
So there would be no explicit Java interface binding?  How would  
complex types as parameters be handled?  Personally, I feel much  
safer about model replication along w/ MDD/MVC style applications  
rather than code calling code in a distributed fashion.  Given what  
I've read regarding Peter's work with this, I'd love to see it  
working in a pure OSGi context.
-Ken
On Jul 17, 2006, at 11:33 PM, Scott Lewis wrote:
Hi Peter,
I had a chance to take a look at your pub sub example a little  
today described here:
http://wiki.eclipse.org/index.php/ 
Enhanced_Publish_and_Subscribe_Support
...very cool.  I like the way that the published services are then  
able to provide multicast-like state updates only for the clients  
that have registered interest (subscribed).
While looking at the example running and then looking at the code  
the following question popped into my head:  Why not use this (or  
something like it) to expose a distributed OSGI services registry?   
That is, just like you distribute PublishedServiceDescriptions, we  
could replicate the information typically contained in the OSGI  
service registry about a service, and then allow remote clients to  
lookup/find service references, and then resolve those service  
references into 'proxy' objects to call remote services.
So, for an example consider the IRemoteServiceContainer interface  
presented here:  http://wiki.eclipse.org/index.php/ 
Remote_OSGI_Services.
public interface IRemoteServiceContainer {
	
	public void addRemoteServiceListener(IRemoteServiceListener  
listener);
	public void removeRemoteServiceListener(IRemoteServiceListener  
listener);
	
	public IRemoteServiceRegistration registerRemoteService(String []  
clazzes, Object service, Dictionary properties) throws ECFException;
	public IRemoteServiceReference[] getRemoteServiceReferences(ID []  
idFilter, String clazz, String filter) throws ECFException;
	public IRemoteService getRemoteService(IRemoteServiceReference  
ref) throws ECFException;
	public boolean ungetRemoteService(IRemoteServiceReference ref);
	
}
Analogous to the BundleContext.registerService(...) method is the  
IRemoteServiceContainer.registerRemoteService(...) method.  The  
intention is that this would be used upon bundle initialization  
(typically) to connect a given container and register local  
services with that container for remote access (very similar to  
what services have to do to register themselves with the OSGi  
platform now).
So underneath the covers, this registerRemoteService call could  
update a replicated registry (table) containing information about  
all of the registered services for all of the containers within a  
given ECF group.  Such a distributed registry could very well use  
what you have created for distributed services to do its work.
Then, on the client side (those that want to consume services),  
analogous to the BundleContext.getServiceReferences(...) method,  
the IRemoteServiceContainer.getRemoteServiceReferences(...) method  
would be called by clients to search/retrieve  
IRemoteServiceReference objects...which contain the identifying  
information about a remote service (but not actual access to the  
service itself).  The  
IRemoteServiceContainer.getRemoteServiceReferences(...) call could  
search the current distributed registry contents (with the  
specified search criteria) and use the contents of the registry to  
return value IRemoteServiceReference instances.
Then, analogous to BundleContext.getService(ServiceReference),  
clients could resolve service references into an interface for  
calling methods on a remote service by calling  
IRemoteServiceContainer.getRemoteService(IRemoteServiceReference).   
This returns an IRemoteService instance, which would allow several  
kinds of interaction with the remote service:  1)  
IRemoteService.callSynch(...): which would provide blocking call/ 
return semantics; 2) IRemoteService.callAsynch(...) (either one)  
which sends a message to remote service, and either uses polling  
(AsynchResult) or notification to receive a return value; and 3)  
IRemoteService.fire(...): which would simply send a one-way message  
to invoke the remote service but not expect or wait for a return  
value.
So perhaps we could use the machinery in Peter's pub sub example  
code to implement this distributed registry.  What do people think  
about this idea?
Scott