En el coraz�n del motor de c�lculo hay un protocolo que permite que se le puedan enviar trabajos, el motor de c�lculo ejecuta esos trabajos, y los resultados son devueltos al cliente. Este protocolo est� expresado en interfaces soportados por el motor de c�lculo y por los objetos que le son enviados.

El protocolo del motor de c�lculo en acci�n.
Cada uno de los interfaces contiene un s�lo m�todo. El interface del motor de c�lculo Compute, permite que los trabajos sean enviados al motor, mientras que el interface Task define c�mo el motor de c�lculo ejecuta una tarea enviada.
El interface compute.Compute define la parte accesible remotamente - el propio motor de c�lculo. Aqu� est� el interface remoto con su �nico m�todo.
package compute; import java.rmi.Remote; import java.rmi.RemoteException; public interface Compute extends Remote { Object executeTask(Task t) throws RemoteException; }
Al extender el interface java.rmi.Remote, este interface se marca a s� mismo como uno de aquellos m�todos que pueden ser llamados desde cualquier m�quina virtual. Cualquier objeto que implemente este interface se convierte en un objeto remoto.
Como miembro de un interface remoto, el m�todo executeTask es un m�todo remoto. Por lo tanto, el m�todo debe ser definido como capaz de lanzar una java.rmi.RemoteException. Esta excepci�n es lanzada por el sistema RMI durante una llamada a un m�todo remoto para indicar que ha fallado la comunicaci�n o que ha ocurrido un error de protocolo. Una RemoteException es una excepci�n chequeada, por eso cualquier m�todo Java que haga una llamada a un m�todo remotor necesita manejar esta excepci�n, captur�ndola o declar�ndola en sus clausula throws.
El segundo interface necesitado por el motor de c�lculo define el tipo Task. Este tipo es utilizado como un argumento del m�todo executeTask del interface Compute. El interface compute.Task define el interface entre el motor de c�lculo y el trabajo que necesita hacer, proporcionando la forma de iniciar el trabajo.
package compute; import java.io.Serializable; public interface Task extends Serializable { Object execute(); }
El interface Task define un s�lo m�todo, execute. Este m�todo devuelve un Object, y no tiene par�metros ni lanza excepciones. Como este interface no extiende Remote, el m�todo no necesita listar java.rmi.RemoteException en su clausula throws.
El valor de retorno de los m�todos executeTask de Compute y execute de Task es declarado como del tipo Object. Esto significa que cualquiera tarea que quiera devolver un valor de uno de los tipos primitivos de Java (como un int o un float) necesita crear un ejemplar de la clase envolvente equivalente para ese tipo (como un Integer o un Float) y devolver ese objeto en su lugar.
Observamos que el interface Task extiende el interface java.io.Serializable. El RMI utiliza el mecanismo de serializaci�n de objetos para transportar objetos entre m�quinas virtuales. Implementar Serializable hace que la clase sea capaz de convertirse en un stream de bytes auto-descriptor que puede ser utilizado para reconstruir una copia exacta del objeto serializado cuando el objeto es le�do desde el stream.
Se pueden ejecutar diferentes tipos de tareas en un objeto Compute siempre que sean implementaciones del tipo Task. Las clases que implementen este interface pueden contener cualquier dato necesario para el c�lculo de la tarea, y cualquier otro m�todo necesario para ese c�lculo.
As� es c�mo RMI hace posible este sencillo motor de c�lculo. Como RMI puede asumir que los objetos Task est�n escritos en Java, las implementaciones de los objetos Task que anteriormente eran desconocidas para el motor de c�lculo son descargadas por el RMI dentro de la m�quina virtual del motor de c�lculo cuando sea necesario. Esto permite a los clientes del motor de c�lculo definir nuevos tipos de tareas para ser ejecutadas en el servidor sin necesitar que el c�digo sea instalado expl�citamente en dicha m�quina. Adem�s, como el m�todo executeTask devuelve un java.lang.Object, cualquier tipo de objeto Java puede ser pasado como valor de retorno en una llamada remota.
El motor de c�lculo, implementado por la clase ComputeEngine, implementa el interface Compute, permitiendo que diferentes tareas le sean enviadas mediante llamadas a su m�todo executeTask. Estas tareas se ejecutan utilizando la implementaci�n de task del m�todo execute. El motor de c�lculo devuelve los resultados a su llamador a trav�s de su valor de retorno: un Object.