2009-11-17 24 views
6

¿Alguien sabe cómo usar Java para Strong code mobility? ¿Alguna vez lo has hecho antes?Java: movilidad de código fuerte ¿Cómo?

Esto es lo que trato de lograr.

Supongamos que tenemos 2 aplicaciones separadas de Java que se comunican a través de la red. Aplicación A y aplicación B.

La aplicación A tiene una clase x instanciada como objeto, y la ha estado usando. La aplicación B no tiene conocimiento previo de esta clase x.

App A necesita migrar el ejemplo de clase x a App B. App B debe ser capaz de cargar dinámicamente clase x, y retiene el estado de clase x.

He buscado en Google y he encontrado varios recursos sobre cómo cargar dinámicamente la clase en tiempo de ejecución. Sin embargo, no estoy seguro si el mecanismo de transferir una instancia de objeto a través de la red junto con su estado, y invocarlo dinámicamente está cubierto.

¡Cualquier apuntador sería muy útil, y gracias de antemano!

NOTA: que más me interesa es cómo (es decir, el enfoque, forma de pensar), este problema se resuelve, no lo se utiliza para resolver este; esto se debe a que tengo la tarea de encontrar mi propia solución para resolver este problema. Aunque señalar libraries/framework es excelente, sería ideal si las respuestas se publican de personas que han hecho algo como esto antes (aunque sea raro).

+0

¡Suena interesante! Si estuviera informado sobre este tema, publicaría esto como una respuesta, pero lo publicaré como un comentario. ¿Podría transferir el objeto, enviando primero la definición de clase serializada, cargar eso en el ensamblaje, y luego enviar el objeto real y cargarlo luego usando la definición de clase (observe el reflejo si no lo hizo). ¡Eso sería muy divertido! – Zoidberg

+0

Borré mi respuesta, ya que es claro que debo leer algo antes de salir corriendo por el borde. Dicho esto, creo que hay un caso para el diseño simplificado de datos móviles en lugar de código. Sin embargo, si realmente está haciendo operaciones distribuidas de tiempo crítico, la movilidad del código puede ser ideal. – Cliff

Respuesta

0

Hay un proyecto llamado cajo que puede mover objetos dinámicamente a través de la red. Aunque no estoy seguro del estado de ejecución.

0

En Java normal, necesitas una forma de que la aplicación B cargue la clase para el objeto, luego debes serializar el objeto de la aplicación A a la aplicación B. Podrías hacerlo, quizás, si las clases están disponibles en alguna ubicación central, como un servidor HTTP. Pero en el caso general en el que desee transferir un objeto completamente nuevo a la aplicación B, deberá implementar su propio cargador de clases (o buscar una biblioteca que lo haga).

Si todos sus objetos son serializables y tiene una ubicación central para almacenar las clases, esto debería ser bastante sencillo de implementar. Puede usar el URLClassLoader para cargar clases desde un servidor http, luego la Serialización Java normal para transferir sobre el objeto serializado. Se requeriría cierta coordinación entre las aplicaciones A y B para que B sepa qué clase cargar y A sabe cuándo enviar el objeto, y B sabe cómo continuar la ejecución de los métodos del objeto. Con este enfoque, probablemente no haya forma de que el objeto X esté en progreso de ejecución de un método; tendría que detenerse y luego reiniciar su ejecución en cooperación con la aplicación A.

2

Pregunta sobre la movilidad fuerte, pero sus requisitos se cumplen con movilidad débil, que con algunas limitaciones es proporcionada por el protocolo RMI. RMI no solo es compatible con RPC, serialización de objetos y gráficos de objetos distribuidos, sino también con el uso compartido de código utilizado habitualmente para que el cliente pueda cargar el bytecode de clases que solo conoce el servidor y ejecutar ese bytecode localmente.

Strong movilidad no es compatible con Java y no puedo pensar en una forma de implementarlo sin hacer extensiones de propiedad de la máquina virtual.Esencialmente, una fuerte movilidad en un contexto Java significaría suspender o pausar un hilo en una máquina virtual, transferir todas las instancias de objeto accesibles desde esa secuencia, posible bytecode requerido para la ejecución y el hilo interno st (pila de llamadas, etc.) a un diferentes máquinas virtuales y hacer que vuelva a crear el estado del hilo y continuar la ejecución en el punto donde el hilo se detuvo en la máquina virtual original.

-2

Si está utilizando JDK6 puede enviar el código fuente, compilarlo, por lo que ahora el cargador de clases puede encontrar esta nueva clase, ya que fue compilada dinámicamente.

El truco es que es posible que deba usar un poco de DI para cargar esto en su aplicación, por lo que necesita un marco DI que pueda funcionar dinámicamente.

Luego, cuando se inyecta en su clase, establece las propiedades en ese punto.

Deben tener una interfaz conocida. Es necesario que exista un contrato del que ambos puedan depender.

No lo he probado, y no creo que Java sea el lenguaje correcto para esto. Si debe tener esta funcionalidad, puede ver algo como uno de los lenguajes de script de jvm o Clojure, ya que espero que también funcione con esto, y luego haga que su aplicación java interactúe con este otro marco dinámico, como lo haría con todo se ejecuta en el jvm.

ACTUALIZACIÓN:

Aquí hay un enlace en la compilación sobre la marcha, con JDK5 ya que algo que mucha gente puede no estar familiarizado.

http://fivedots.coe.psu.ac.th/~ad/jg/javaArt1/index.html

0

se necesitan dos cosas transferidos de A a B con el fin de mover una instancia de la clase I C.

En primer lugar la definición de clase de C (por lo general en forma de una lista de códigos de bytes) y luego la forma serializada de I. Tenga en cuenta que debe usar la serialización XML instald de la antigua serialización binaria.

La parte realmente difícil es conseguir las dependencias de C transferidos como sea necesario para transferir esencialmente todas las superclases de C también, además de todos los tipos de retorno y los tipos de campo, y sus superclases y de retorno/tipos de campo, etc., etc. .

Si realmente necesita hacer esto para todos los valores posibles de C, su mejor opción es usar un marco diseñado para hacer esto como un grid one o Terracotta. Si puede restringirse a, por ejemplo, una interfaz dada y estrecha, probablemente será mucho mejor. También considere usar propiedades para esto, ya que son muy simples y pueden llevarlo lejos.

1

He escrito una biblioteca de código abierto que admite Code Mobility exactamente como se preguntó anteriormente. En realidad, también es compatible con el uso de tipo RPC.

Ver: Mobility-RPC - Seamless Code Mobility and RPC for the Java platform

En términos de donde este se encuentra en la movilidad débil frente al fuerte movilidad: en medio.

Cuando transfiere un objeto a una máquina remota, puede controlar qué método del objeto se invoca, y con qué argumentos, cuando llega a la máquina remota.Entonces, si está escribiendo un agente móvil, puede decidir por sí mismo cómo quiere reanudar la ejecución en la máquina siguiente antes de que se transfiera, no tiene que reanudarse desde el mismo lugar.