next up previous
Next: Un'interfaccia grafica per l'ADSL Up: Parte IV: l'Agent Directory Previous: Gestione degli errori


Creazione dell'oggeto remoto ADSL

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).

Figure: Creazione di un oggetto di tipo ADSLImpl e iscrizione presso l'rmiregistry.
Image smile-banditore-cliente-rmi-fase1.png
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,

Figure: Lookup dell'oggetto di tipo ADSL presso rmiregistry.
Image smile-banditore-cliente-rmi-fase2.png
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)
Figure: Iscrizione di un oggetto di tipo RemoteMessageBox presso l'ADSL.
Image smile-banditore-cliente-rmi-fase5.png
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),

Figure: Richiesta di un RemoteMessageBox mediante l'ADSL.
Image smile-banditore-cliente-rmi-fase6.png
quindi invocare su di esso il metodo writeMessage per inserire un oggetto di tipo Message sulla casella remota (si veda la Figura 9).
Figure: Scrivere un messaggio su un MessageBox remoto.
Image smile-banditore-cliente-rmi-fase7.png
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.
Figure: Rimozione della MessageBox dalla ADSL.
Image smile-banditore-cliente-rmi-fase8.png

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 *.java
la creazione dei file stub per MessageBox e ADSLImpl
> rmic -v1.2 MessageBox
> rmic -v1.2 ADSLImpl
E 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).


next up previous
Next: Un'interfaccia grafica per l'ADSL Up: Parte IV: l'Agent Directory Previous: Gestione degli errori
Matteo Baldoni 2004-03-19