Si crei un oggetto di tipo ADSLImpl e si effettui il bind (o il rebind) dell'oggetto presso un rmiregistry attivo (si veda la Figura 5).
Tutto questo lo si realizzi, ad esempio, mediante il main di una classe di nome ProvaADSL del tipo:public class ProvaADSL { public static void main(String[] args) { ... ADSLImpl adsl = new ADSLImpl(); try { // la riga seguente e' in alternativa con l'attivazione // a prompt del rmiregistry java.rmi.registry.LocateRegistry.createRegistry(2000); Naming.rebind("rmi://127.0.0.1:2000/ADSL", adsl); } catch (Exception e) { System.err.println("Failed to bind to RMI Registry"); System.exit(1); } ... } }
A questo punto, in un'altra o più classi, ad esempio ProvaRemoteMessageBoxUno, ProvaRemoteMessageBoxDue, si effettui il lookup presso l'rmiregistry dell'oggetto ADSL creato in ProvaADSL, si veda la Figura 6,
quindi si crei un oggetto di tipo MessageBox (che è anche un oggetto di tipo RemoteMessageBox) e lo si iscriva presso l'ADSL attraverso l'invocazione del metodo remoto insertRemoteMessageBox, si veda la Figura 7) Il codice potrebbe essere del tipo:public class ProvaRemoteMessageBoxUno { public static void main(String[] args) { ... ADSL adsl; AgentID myID; MessageBox box1; try { myID = new AgentID(); ... adsl = (ADSL)Naming.lookup("rmi://127.0.0.1:2000/ADSL"); box1 = new MessageBox(); box1.setOwner(myID); ... adsl.insertRemoteMessageBox(box1); } catch(Exception e) { System.out.println("Failed rmi" + e); } ... } }
Ora è possibile da uno dei vari programmi richiedere mediante il metodo getRemoteMessageBox un oggetto di tipo RemoteMessageBox disponibile remotamente (si veda la Figura 8),
quindi invocare su di esso il metodo writeMessage per inserire un oggetto di tipo Message sulla casella remota (si veda la Figura 9). Si legga quindi la propria casella per verificare se sono arrivati messaggi inviati da altri programmi (esempio, ProvaRemoteMessageBoxDue). Infine si cancelli dal ADSL l'oggetto MessageBox iscritto precedentemente (questo per simulare il momento che l'agente viene tolto dalla piattaforma), si veda la Figura 10.Il codice dovrebbe assomigliare al seguente:
public class ProvaRemoteMessageBoxUno { public static void main(String[] args) { ... ADSL adsl; AgentID myID; MessageBox box1; try { myID = new AgentID(); ... adsl = (ADSL)Naming.lookup("rmi://127.0.0.1:2000/ADSL"); box1 = new MessageBox(); box1.setOwner(myID); ... adsl.insertRemoteMessageBox(box1); ... Message msg = new Message(); ... AgentID agentRemoteID = new AgentID(); ... RemoteMessageBox remoteBox2 = adsl.getRemoteMessageBox(agentRemoteID); remoteBox2.writeMessage(msg); ... Message myMsg = box1.readMessage(); System.out.println(myMsg); ... adsl.removeRemoteMessageBox(myID); ... } catch(Exception e) { System.out.println("Failed rmi" + e); } ... } }A questo punto si proceda con la compilazione di tutti i file sorgenti
> javac *.javala creazione dei file stub per MessageBox e ADSLImpl
> rmic -v1.2 MessageBox > rmic -v1.2 ADSLImplE si proceda con l'esecuzione, si avvii lo rmiregistry e ProvaADSL
> rmiregistry 2000 & > java ProvaADSL(il comando "&" è per UNIX, per Windows si usino più finestre DOS diverse), entrambi i comandi dati attiveranno un processo che terminerà solo mediante un CTRL-C esplicito. Quindi si lancino da altri due finestre di comando i programi ProvaRemoteMessageBoxUno e ProvaMessageBoxDue
> java ProvaRemoteMessageBoxUno
Alcune note. Lo scopo dell'ADSL è quello di evitare di effettuare presso ogni agente la lookup delle caselle di ogni altro agente presente nel sistema e questo al fine di ottenere una maggiore dinamcità della piattaforma. La lookup nell'esempio esposto è effettuato infatti sul solo oggetto di tipo ADSL. Al fine di ottenere un corretto funzionamento della piattaforma è comunque il fatto che gli oggetti MessageBox siano dichiarati anche remoti e iscritti presso un rmiregistry. Infatti, se gli oggetti MessageBox non fossero remoti, l'effetto di passarli come parametro del metodo insertRemoteMessageBox o come valore di ritorno del metodo getRemoteMessageBox creerebbe una copia presso l'ADSL anzichè un riferimento all'aggetto stesso e quindi non si avrebbe l'effetto desiderato (si veda anche [3, Sezione 5.2]).
Altro punto importante da notare è relativo alla realizzazione dei metodi della classe ADSLImpl, questi sono insertRemoteMessageBox, getRemoteMessageBox e removeRemoteMessageBox. In tutti e tre questi metodi si deve cercare un certo RemoteMessageBox dato un oggetto di tipo AgentID, o perchè deve essere verificato se un certo RemoteMessageBox è già presente prima di inserirne uno nuovo (insertRemoteMessageBox), o perchè deve essere restituito dal metodo stesso come valore di ritorno (getRemoteMessageBox) o perchè ne è stata richiesta la cancellazione (removeRemoteMessageBox). È importante assicurarsi che le realizzazioni di questi metodi utilizzino il metodo equals definito in AgentID per un corretto funzionamento.
Si osservi come l'oggetto di tipo ADSL funga da vero e proprio rmiregistry esteso. Infatti non è necessario effetture alcuna rebind o lookup degli oggetti di tipo MessageBox per condividerne i riferimenti remoti (ma questi comunque debbono essere dichiarati remoti per poter passare il solo riferimento remoto come parametro o valore restituto della insertRemoteMessageBox e getRemoteMessageBox, rispettivamente, e non come copia).