Domanda

Ho una chiamata RMI definita come:

public void remoteGetCustomerNameNumbers(ArrayList<String> customerNumberList, ArrayList<String> customerNameList) throws java.rmi.RemoteException;

La funzione esegue una ricerca nel database e popola i due ArrayList.La funzione chiamante non ottiene nulla.Credo che funzioni con i tipi Vector.

Devo utilizzare Vector o esiste un modo per farlo funzionare senza effettuare due chiamate.Ho altre idee che probabilmente utilizzerei, come restituire una coppia chiave/valore, ma mi piacerebbe sapere se riesco a farlo funzionare.

Aggiornamento:
Se potessi, accetterei tutte le risposte fornite finora.Non conoscevo il costo della rete, quindi ha senso rielaborare la funzione per restituire un LinkedHashMap invece dei due ArrayList.

È stato utile?

Soluzione

Come menziona Tom, puoi passare oggetti remoti.Dovresti creare una classe per contenere il tuo elenco che implementa Remote.Ogni volta che passi qualcosa che implementa Remote come argomento, ogni volta che il lato ricevente lo utilizza, si gira ed effettua una chiamata remota Indietro al chiamante per lavorare con quell'oggetto.

Altri suggerimenti

Gli argomenti in RMI chiamano un serializzato.La deserializzazione sul server crea una copia delle liste.Se gli elenchi rimanessero lato client, il numero di chiamate di rete sarebbe piuttosto elevato.Puoi passare oggetti remoti, ma fai attenzione alle implicazioni sulle prestazioni.

Perdi i tuoi riferimenti quando effettui la chiamata remota.Dovrai restituire gli elenchi anziché aspettarti che vengano popolati dalla chiamata remota.

Come altri hanno già menzionato, quando si passano oggetti come parametri a un metodo RMI, l'oggetto verrà serializzato, quindi deserializzato dall'altra parte all'interno dell'oggetto di destinazione contenente il metodo RMI.Ciò interrompe il riferimento dagli oggetti originali passati, poiché ora hai due oggetti distinti:uno nel codice client che chiama il metodo e uno sul lato remoto.

In questo esempio specifico, un approccio migliore sarebbe quello di suddividere le chiamate al metodo (poiché sembra che tu stia facendo due cose in un metodo:ottenere i nomi dei clienti e ottenere i numeri dei clienti) e invece di restituire i risultati al chiamante anziché trasmetterli in una raccolta...in questo modo:

public ArrayList<String> getCustomerNames() throws java.rmi.RemoteException;

public ArrayList<String> getCustomerNumbers() throws java.rmi.RemoteException;

Poiché sia ​​ArrayList che String implementano Serializable, i risultati nella raccolta verranno serializzati e inviati in rete al codice client che chiama il metodo, a quel punto potrai lavorare con i dati come preferisci.Se invece devi utilizzare un oggetto personalizzato nella raccolta, purché la tua classe implementi l'interfaccia java.io.Serializable e segua le specifiche per quell'interfaccia non dovresti avere problemi.

Ciò comporterebbe due chiamate separate via cavo, ma è un'interazione molto più pulita e semplice ed evita il problema dell'interruzione dei riferimenti nell'esempio originale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top