2009-11-17 9 views
6

Qualcuno sa come usare Java per Strong code mobility? L'hai mai fatto prima?Java: mobilità del codice forte Come fare?

Ecco cosa cerco di raggiungere.

Supponiamo di disporre di 2 applicazioni Java separate che comunicano tramite rete. App A e App B.

L'app A ha una classe x istanziata come oggetto e lo sta utilizzando. L'app B non ha precedenti conoscenze di questa classe x.

App A deve migrare l'istanza di di classe x verso App B. App B dovrebbe essere in grado di caricare dinamicamente classe x, e mantiene lo stato di classe x.

Ho cercato su Google e ho trovato un sacco di risorse su come caricare dinamicamente la classe in fase di esecuzione. Tuttavia, non sono sicuro se il meccanismo di trasferimento di un'istanza dell'oggetto sulla rete insieme al relativo stato e di richiamarlo dinamicamente sia coperto.

Qualsiasi suggerimento sarebbe molto utile, e grazie in anticipo!

NOTA: Sono per lo più interessati a come (vale a dire l'approccio, modo di pensare) questo problema è risolto, non quello viene utilizzato per risolvere questo; questo perché ho il compito di trovare la mia soluzione per risolvere questo problema. Anche se indicare le librerie/framework è fantastico, sarebbe l'ideale se le risposte venissero pubblicate da persone che hanno già fatto qualcosa di simile prima (per quanto raro).

+0

Sembra interessante! Se fossi stato informato su questo argomento, lo avrei postato come risposta, ma lo pubblicheremo come commento. È possibile trasferire l'oggetto, inviando prima la definizione della classe Serialized, caricarla nell'assembly, quindi inviare l'oggetto effettivo e caricarlo, quindi utilizzare la definizione della classe (Se non si è in presenza, osservare la riflessione). Quello sarebbe un bel friggen cooL! – Zoidberg

+0

Ho cancellato la mia risposta come se fosse chiaro che avrei dovuto leggere qualcosa prima di scappare dal labbro. Detto questo, credo che ci sia un caso per la progettazione semplificata di dati in movimento rispetto al codice. Tuttavia, se stai davvero facendo operazioni di tempo critico distribuito, la mobilità del codice potrebbe essere l'ideale. – Cliff

risposta

0

C'è un progetto chiamato cajo che può spostare gli oggetti dinamicamente sulla rete. Tuttavia non sono sicuro dello stato di esecuzione.

0

In Java normale è necessario un modo per fare in modo che App B carichi la classe per l'oggetto, quindi è necessario serializzare l'oggetto dall'app A all'App B. Si potrebbe fare ciò, forse, se le classi sono disponibili in qualche posizione centrale come un server HTTP. Ma nel caso generale in cui si desidera trasferire un oggetto completamente nuovo all'App B, è necessario implementare il proprio classloader (o trovare una libreria che lo faccia).

Se tutti gli oggetti sono serializzabili e si dispone di una posizione centrale per memorizzare le classi, questo dovrebbe essere abbastanza semplice da implementare. È possibile utilizzare URLClassLoader per caricare le classi da un server http, quindi la normale serializzazione Java per il trasferimento sull'oggetto serializzato. Sarebbe necessario un certo coordinamento tra le app A e B in modo che B sappia quale classe caricare e A sappia quando inviare l'oggetto, e B sappia come continuare l'esecuzione dei metodi dell'oggetto. Con questo approccio non è probabilmente possibile che l'oggetto X sia in corso di esecuzione di un metodo; dovrebbe fermarsi e quindi riavviare la sua esecuzione in collaborazione con l'App A.

2

Chiedete di una forte mobilità, ma i vostri requisiti sono soddisfatti con una mobilità debole, che con alcune limitazioni è fornita dal protocollo RMI. RMI non supporta solo RPC, serializzazione di oggetti e grafici di oggetti distribuiti, ma anche la condivisione di codice solitamente utilizzata in modo che il client possa caricare il bytecode di classi solo noto al server ed eseguire quel bytecode localmente.

Java non supporta la forte mobilità e non riesco a pensare a un modo per implementarlo senza creare estensioni proprietarie alla VM.Essenzialmente, una forte mobilità in un contesto Java significherebbe sospendere o mettere in pausa un thread in una VM, trasferire tutte le istanze dell'oggetto raggiungibili da quel thread, potenzialmente codice byte richiesto per l'esecuzione e la st interna (stallo chiamate ecc.) Ad un VM diverse e farlo ricreare lo stato del thread e continuare l'esecuzione nel punto in cui il thread è stato messo in pausa nella VM originale.

-2

Se si utilizza JDK6 è possibile inviare il codice sorgente, compilarlo, quindi ora il classloader può trovare questa nuova classe, poiché è stata compilata in modo dinamico.

Il trucco è che potrebbe essere necessario utilizzare alcuni DI per ottenere questo caricato nell'applicazione, quindi è necessario un framework DI che può funzionare in modo dinamico.

Quindi, quando viene iniettato nella classe, le proprietà vengono impostate in quel punto.

Questi dovrebbero avere un'interfaccia nota. Deve esserci un contratto da cui entrambi possono dipendere.

Non l'ho provato, e non credo che Java sia la lingua corretta per questo. Se devi avere questa funzionalità potresti voler guardare qualcosa come uno dei linguaggi di scripting jvm o Clojure, poiché mi aspetto che funzioni anche con questo, e poi far interagire l'applicazione Java con questo altro framework dinamico, come farebbe tutto sta funzionando sul jvm.

UPDATE:

Ecco un link sulla compilazione on-the-fly, con JDK5 come qualcosa che molte persone potrebbero non essere a conoscenza.

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

0

Hai bisogno di due cose trasferite da A a B in modo da spostare un'istanza I della classe C.

prima la definizione della classe di C (di solito sotto forma di un elenco di codici di byte) e quindi la forma serializzata di I. Si noti che è necessario utilizzare la serializzazione XML instad della vecchia serializzazione binaria.

La parte veramente difficile è ottenere le dipendenze di C trasferiti come è necessario trasferire sostanzialmente tutti i superclassi di C anche, più tutti i tipi restituiti ei tipi di campo, e la loro superclassi e ritorno/tipi di campo, ecc ecc ecc.

Se si ha davvero bisogno di fare questo per tutti i possibili valori di C, la soluzione migliore è usare un framework progettato per farlo come uno di griglia o Terracotta. Se puoi trattenerti ad es. un'interfaccia data e stretta, probabilmente starai molto meglio. Considera anche solo l'utilizzo di proprietà per questo, in quanto sono molto semplici e possono portarti lontano.

1

Ho scritto una libreria open source che supporta la mobilità del codice esattamente come richiesto sopra. In realtà supporta anche l'utilizzo di tipo RPC.

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

In termini di dove questo si trova sulla mobilità debole rispetto a forte mobilità: nel mezzo.

Quando si trasferisce un oggetto su una macchina remota, è possibile controllare quale metodo sull'oggetto viene richiamato e con quali argomenti, quando arriva sulla macchina remota.Quindi, se stai scrivendo un agente mobile, allora può decidere da solo come vuole riprendere l'esecuzione sulla macchina successiva prima che si trasferisca da solo, non deve riprendere dallo stesso posto.

Problemi correlati