14 enero 2005

Algunas cosas de rmi

He estado revisando lo de rmi y he aprendido varias cosas

La primera es que los objetos remotos en teoría deben implementar Remote, pero en la práctica, veo que deben heredar de RemoteObject y lo normal es que lo hagan heredando de UnicastRemoteObject. Si símplemente se implementa la interface Remote, cuando el servidor de rmi registra el objeto, símplemente lo registra y luego termina. Si heredamos de UnicastRemoteObject, el objeto se registra, pero el servidor se queda corriendo. De esta forma, cuando llamemos remotamente al objeto, se ejecuta en este servidor que queda vivo.

Otra opción que he leido pero no probado, es que si no queremos heredar de RemoteObject o UnicastRemoteObject, se puede simplemente implementar la interface Remote, pero entonces debemos llamar a alguno de los métodos UnicastRemoteObject.exportObject()

Una vez compilado el objeto remoto (supongamos que es ObjetoRemoto.class), es necesario pasarle la herramienta rmic de java. A esta herramienta se le pasa la clase ObjetoRemoto y genera un ObjetoRemoto_Stubs.class y ObjetoRemoto_Skel.class. Este último sólo sirve para versiones de clientes rmi con versión de java anteriores a la 1.2

¿Para qué sirve el ObjetoRemoto_Stubs?. Cuando un cliente quiere llamar remotamente a un método de ObjetoRemoto, en realidad java tiene que hacer varias cosas. Debe traducir todos los parámetros del método a un "formato de red" estandard, de forma que independientemente de dónde corran el cliente y el servidor, sus versiones de java, etc, entiendan ese parámetro. También debe enviar algún tipo de mensaje por red al servidor de rmi indicándole que método de ObjetoRemoto debe ejecutarse y pasarle los parámetros.

ObjetoRemoto_Stubs hace todo eso, de forma que cuando nuestro cliente rmi pide un ObjetoRemoto, en realidad le pasan un ObjetoRemoto_Stubs. Cuando nuestro cliente rmi llama a un método de ObjetoRemoto_Stubs, este se encarga de formatear los parámetros, enviar el mensaje por red al servidor de rmi, esperar la vuelta, formatear la vuelta de formato red al formato específico del sitio en el que corre el cliente.

El cliente necesita ver en su classpath la Interface remota del objeto remoto, que es la Interface que contiene los métodos remotos a los que se puede llamar. También necesita ver al ObjetoRemoto_Stubs, que es el que en realidad recibe cuando pide el ObjetoRemoto.

En cuanto al tema del fichero de permisos java.policy, he visto que tengo problemas que no sé muy bien a qué se deben. En teoría, colocando este fichero en el home del usuario (en mi caso c:\documents and settings\chuidiang), debería encontrarlo. No sé muy bien a qué es debido, pero hay veces que me da problemas y es como si no lo encontrara.

La solución que he dado de momento, es cambiar la propiedad java.security.policy, en la que se puede especificar el fichero. La llamada sería algo como esto

System.setProperty ("java.security.policy", "mi_path/java.policy");

Todo esto está comentado y con un ejemplo sencillo de código en mi página http://www.geocities.com/chuidiang/java/rmi/rmi.html

No hay comentarios: