Peter wrote:
----- Original message -----
On 7/31/2011 5:35 AM, Peter Firmstone wrote:
I think this would be useful in an internet environment, where a developer
wants to export an object and hand it as a parameter to another service, and
have it unexported automatically when no longer required.
This is why I make my smart proxy classes be InvocationHandlers and then embed
the real remote object and a lease into the marshalled object.  With deferred
unmarshalling, then others who unmarshall it for use, apply a
LeaseRenewalManager on the lease as well so that everyone using it is making
sure the server is not releasing it.

Endpoints as they exist today, are not mobile because of code contamination and
lost-code-base issues that occur when a remote object is remarshalled to send
across the wire.

Multiple unmarshalling activities in the same JVM might not be safe if there is
static class initialization that should of been per-instance.

I think this is an area that needs some investigation for sure.

Gregg

Spot on, I think we can fix this by defining the jini platform that should be 
available on the classpath then stick to it.  Anything else required (apart 
from service api) must go into child classloaders.

Anything that's serializable in the platform must remain backward compatible 
(serialized form) and must be present in all nodes.

We should attempt to put implementation into a child classloader, so it isn't 
resolved prior to proxy classloader class resolution, allowing proxy's to have 
their own implementations.

Instead of using the current preferred classes mechanism, the order of class 
resolution would be:

Proxy classloader, delegates first to the application classloader. (classpath), 
which delegates to the extension and system classloaders, then finally it try's 
the proxy classloader own codebase.

If a class is still unresolved then we could try the Platform Implementation 
classloader, which could be obtained by a static class reference.  
Alternatively, platform implementation classes shouldn't be serializable.

Services shouldn't be visible in the application classloader, only their 
service api.

We can provide abstract classes and interfaces for the platform, for various implementations to cooperate with, while preserving implementation codebase annotations and proxy and service implementations separated in their own classloaders (because these classes don't exist in the parent classloader). Different implementations can coexist in separate classloaders and cooperate using common superclasses and interfaces in the application, extension or system classloaders.
Shared state can be managed in abstract classes using protected static methods 
with synchronization and security checks, all static fields private.  Abstract 
object state can be similarly manged with protected methods and private fields.

We have the advantage that service api already utilise interfaces.
Along with a rename of the com.sun namespace, this is an opportunity to fix 
some long standing issues that have discouraged wider adoption.

It should be possible to pass on distributed objects to any node without 
issues, this is the fundamental value of Jini over java rmi.

Ideally: There is no dependency on implementation, only api.  Implementation 
shouldn't be known until runtime.

This isn't an easy exercise, but I think that Dennis' recent work with Rio 
might provide some insight.

Separating the platform from service implementations, and providing libraries 
for service implementers to deploy and developing these separately will make it 
clearer what developers can change without worrying about backward 
compatibility. Eg libraries should be free to change.  The platform should be 
stable and evolve with backward compatibility in mind.

This is difficult, but possible, it will take time and cooperation to figure 
out the right solutions, on a case by case basis.

If we can figure out these fundamental issues, we just possibly might hold the 
future of distributed computing in our hands.

Cheers,

Peter.

Another point: the application should also be in it's own child classloader. The River implementation of the Jini Platform, is similar to Java, it's a platform, so why not load River applications into a child classloader, similar to Java, a platform where most application classes are loaded by a child classloader (Known as the application classloader or classpath) and where the extension classloader is provided to extend the platform. Without realising it, we extend the Jini Platform by loading application classes into the same classloader as the platform.

Perhaps the Jini Platform needs it's own application classpath. Application classes shouldn't be visible with the jini platform classes, since this could lead to codebase annotation loss. Only Service API classes and interfaces should be visible in the jini platform.

Cheers,

Peter.

Reply via email to