Hi Paul

Sorry this mail is really late - I've been offline. I just wanted to day
that AltRMI sounds very interesting, I'm keen to help out - particularly
adding JMS bindings, that sounds right up my street.

+1 from me.

James
----- Original Message -----
From: "Paul Hammant" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, January 10, 2002 6:12 PM
Subject: AltRMI - Proposal & request for help


> Folks,
>
> Here is the proposal.  The audience for this tool is those that dislike
> RMI in that it needs special interfaces (must extend Remote, must
> specify RemoteException).  Those people that dislike RMI may have come
> across Glue ( http://www.themindelectric.com/products/glue/glue.html )
> and its unhindered interface publication scheme.  People that dabble
> with .NET claim that it has a similar unencumbered method publication
> scheme.
>
> AltRMI is the same idea as Glue but not over SOAP.  Again, this is not
> for people that think there is nothing wrong with RMI as is.  The first
> alpha version has been used by Avalon-Cornerstone as a XML configurable
> 'block' that other blocks can depend on.  That block has already been
> used by AvalonDB - a full RDBMS being built by a few of us in
> Avalon-Cornerstone's CVS.  Incidentally, AltRMI was code ripped out of
> AvalonDB and generalized.
>
> There are a few differences with Glue :
>
> 1) Not over SOAP.  In this respect Glue is a very accomplished bit of
work.
>
> 2) AltRMI can be instrcted as to what is pass by value and what is pass
> by reference (Glue can't).
>
> 3) Glue does not generate client side proxy code, AltRMI does.  The Glue
> solution is compatible with JDK1.1, 1.2, 1.3, 1.4 (according to Graham
> Glass) and therefore very flexible.  The secret solution Glue uses does
> not support introspection on the client side.  AltRMI does generate
> proxy classes for client side use.  As such it is introspectable.  This
> is of most use to scripting languages/envs (Rhino, Beanshell etc).  At
> the bottom of this email is a example generated proxy class.
>
> We (I) need to build a community around AltRMI.  There are quite a few
> things to do.  Please take a few minutes to read the following proposal.
>  If you are interested in running AltRMI, its CVS dir contains a README
> file for instructions.  Alt positive ideas/patches very welcome.
>
> Regards,
>
> - Paul H
>
> --------------------------------------------------------------------------
>  JAKARTA COMMONS  -  ALTERNATIVE (TO) REMOTE METHOD INVOCATION - "AltRMI"
> --------------------------------------------------------------------------
>
> Abstract:
>
> The AltRMI package provides an alternative to Java's RMI.  Apart from
> simply
> being an alternative it provides the following features:
>
> 1) Any interface publishing
>
>   - no forcing of extension of java.rmi.Remote
>   - no forced declarations of "throws RemoteException"
>
>   * These two features are part of the reason why Graham Glass's 'Glue'
>     product is so successful. His API goes several stages futher in that
>     it pubishes APIs via SOAP so that any language in any location can
>     use Glue published Java services.
>
> 2) Multiple transports
>
>   - Plain Sockets / ObjectStream
>   - via RMI
>   - Piped with same VM / ObjectStream
>   - Direct within same VM
>   - SOAP (planned)
>       - Might require additional undynamic "toWSDL()" step.
>   - CORBA (planned)
>       - Might require additional undynamic "toIDL()" step.
>   - Plain sockets / custom messaging (planned)
>   - JMS (planned)
>
> 3) Speed
>
>   - Using the AltRMI over RMI transport as a baseline.  Measuring 100,000
>     method invocations after discarding the first for the purposes of
>     timing, ObjStream over sockets is three times faster, ObjStream over
>     Pipe is eleven times faster, Direct is a thousand times faster.
Granted
>     there could be less of an advantage if compared to a proper RMI
solution
>     (not layered), or one that is in the same VM with different threads.
>
> 4) Interface/Impl separated design.
>
>   - AltRMI can be build easily into any application or application
> framework.
>     Individual aspects can be reimplemented (or overridden) as the need
>     arises.
>
> 5) Choice of location of generated Proxy class.
>
>   - Classes providing client side implementation of the transported
>     interface(s) can be either on the client side or the server side (and
>     duly transported) at time of lookup.
>
> 6) Choice of castability of generated proxy class.
>
>   - To suit remote facilities that are happy with refection and do
>     not need to cast to an interface to use a bean (I am thinking of
>     beanshell) the proxy class can be generated without specifying
>     that it implements the interface(s).
>
> 7) Suspendable/Resumable service.
>
>   - The Server supports suspend() and resume().  With the current impl
this
>     replies in a timely fashion to the client that the client should try
>     later.  The client waits for the notified amount of time and
seamlessly
>     trys the requets again.  A server could cycle through suspended and
back
>     to resumed will not affect the client except for the a delay.
>
> 8) Recovering transport
>
>   - AltRMI tries to recover its transports should they fail.  The recovery
>     is pluggable in that the developer can choose when/how/if the
connection
>     handler tries to recover the connection.  Any inprogress, but
>     disconnected method invocation will attempt to be recoved and just
> return
>     as normal, albeit after a longer than normal delay.
>
> 9) Event API
>
>   - For suspensions, abnormal ends of connection etc, there is a listener
>     that can be set that will allow actions to be taken.  Abnormally
>     terminated connections will by default try to be reconnected, the
>     listener can decide if, how many, and how often the retries occur.
>
> 10) Unpublishable and republishable API
>
>   - The server is able to unpublish a service.  In conjuction with
>     suspend()/resume() a service can be republished, upgraded etc
>     whilst in use, or just offlined.
>
> 11) Startable API for Server
>
>   - The server implements and acts upon start() and stop() methods.
>
> 12) No just pass by value.
>
>   - AltRMI started life as 'pass by value' only.  In now supports return
>     types and parameters wrapped in another AltRMI Facade.
>
> 13) No duplicate instances.
>
>   - If you call Person p = getPerson("Fred") twice you will get the same
>     instance on the client side is it is the same instance on the server
> side.
>
> Limitations:
>
> 1) Use in EJB
>
>   - This is not of any use for EJB Home/Remote interfaces.  The container
>     maker chooses the transport for use that container, not the bean
coder.
>     This is intended for other client server solutions.  Beside RMI over
> IIOP
>     is Sun specified.
>
> Todo:
>
> 1) Other transports
>
>   - SOAP, CORBA (with WDSL & IDL generation steps)
>   - Other RMI (over IIOP, over HTTP)
>   - Custom, socket protocol
>   - JMS
>
> 2) BCEL for generated proxy class.
>
>   - The current impl writes java source then compiles it.  We could do
this
>     inline with BCEL.  This as an heavier, but more design perfect
>     alternative to the current server side impl.
>
>   - BCEL is really difficult to use if you are not skilled in it!!
>
>
> 3) Client and Server code for secure conversations.
>
> 4) Authentication and Authorisation on lookup(..).
>
> Initial committers:
>
> Paul Hammant (hammant)
>
> --------------------------------------------------------------------------
> Example Generated Proxy class.  Not for editing, not normally
>  for user viewing.  A step similar to rmic.
> --------------------------------------------------------------------------
>
> public final class AltrmiGeneratedHello_Main implements
> org.apache.commons.altrmi.test.TestInterface {
>   private transient
> org.apache.commons.altrmi.client.impl.BaseServedObject mBaseServedObject;
>   public AltrmiGeneratedHello_Main
> (org.apache.commons.altrmi.client.impl.BaseServedObject baseServedObject)
{
>       mBaseServedObject = baseServedObject;
>   }
>   public void hello (java.lang.String v0) {
>     Object[] args = new Object[1];
>     args[0] = v0;
>     try {
>
>
mBaseServedObject.altrmiProcessVoidRequest("hello(java.lang.String)",args);
>     } catch (Throwable t) {
>       if (t instanceof RuntimeException) {
>         throw (RuntimeException) t;
>       } else if (t instanceof Error) {
>         throw (Error) t;
>       } else {
>         throw new
> org.apache.commons.altrmi.common.AltrmiInvocationException("Should never
> get here" + t.getMessage());
>       }
>     }
>   }
>   public boolean hello3 (short v0) throws
> java.beans.PropertyVetoException, java.io.IOException{
>     Object[] args = new Object[1];
>     args[0] = new Short(v0);
>     try {
>       Object retVal =
> mBaseServedObject.altrmiProcessObjectRequest("hello3(short)",args);
>       return ((Boolean) retVal).booleanValue();
>     } catch (Throwable t) {
>       if (t instanceof java.beans.PropertyVetoException) {
>         throw (java.beans.PropertyVetoException) t;
>       } else if (t instanceof java.io.IOException) {
>         throw (java.io.IOException) t;
>       } else      if (t instanceof RuntimeException) {
>         throw (RuntimeException) t;
>       } else if (t instanceof Error) {
>         throw (Error) t;
>       } else {
>         throw new
> org.apache.commons.altrmi.common.AltrmiInvocationException("Should never
> get here" + t.getMessage());
>       }
>     }
>   }
> }
>
>
>
> --
> To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>


_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to