Interfacce lato cliente:
Interfacce lato servente:
Interfacce “comuni”
Modalità statica
Da impiegare quando è nota in fase di programmazione l’interfaccia IDL del servizio.
Per il cliente: interfaccia SII.
Per il servente: interfaccia SSI.
Stub e skeleton sono generati dalla compilazione IDL.
Modalità dinamica
Da impiegare quando non è nota a tempo di compilazione l’interfaccia IDL del servizio.
Per il cliente: interfaccia DII.
Per il servente: interfaccia DSI.
Cliente e servente sono sviluppati separatamente.
In linea di principio sono possibili tutte le quattro combinazioni
La modalità della richiesta è trasparente all’oggetto.
La modalità della risposta è trasparente al cliente.
In pratica: modalità statica per la maggior parte delle applicazioni
La costruzione della richiesta di servizio e la sua trasmissione all’ORB sono a cura del programmatore.
Meccanismo più potente ma più oneroso per il programmatore.
Richiede la conoscenza di alcuni meccanismi interni di funzionamento dell’ORB.
Da impiegare in applicazioni con particolari requisiti di flessibilità.
Fornisce informazioni a tempo d’esecuzione sulle interfacce IDL implementate dagli oggetti.
Si presenta come un contenitore di oggetti che incapsulano definizioni IDL.
Utilizzata dal programmatore applicativo in maniera esplicita o implicita.
Esplicitamente, per:
Implicitamente (cioè dall’ORB), per:
Interfaccia lato servente.
Isola l’oggetto dall’ORB.
Assegna un riferimento univoco (IOR) all’oggetto.
Gestisce il ciclo di vita dell’oggetto.
Fornisce l’astrazione di un servizio sempre disponibile, dalla creazione alla distruzione.
Le prime versioni di CORBA erano basate sul BOA (Basic OA), ora superato.
Si articola nelle seguenti fasi:
Linguaggio: Java
Piattaforma CORBA: Inprise Visibroker
Passo 1: Definizione dell’interfaccia IDL
//File: Message.idl - Interfaccia IDL
interface Message {
string getMessage();
};
Passo 2: Compilazione dell’interfaccia IDL
c:\CORBA> idl2java –package message Message.idl
File generati
Message.java
: contiene un’interfaccia Java corrispondente all’interfaccia IDL;MessageOperations.java
: contiene un’interfaccia Java che corrisponde alle sole operazioni e attributi definiti nell’interfaccia IDL Message;_MessageStub.java
: contiene la classe stub utilizzata dal cliente;MessagePOA.java
: contiene la classe skeleton utilizzata dal lato servente;MessageHelper.java
: contiene la classe di utilità Helper, che definisce alcuni servizi per lo sviluppo del cliente.Passo 3: Sviluppo dell’applicazione cliente
//Cliente Java
import org.omg.orb.*; //Package di libreria
import message.*; //Package generato dalla compilazione IDL
public class Cliente {
public static void main(String[] args) {
//Inizializza l'ORB
ORB orb = ORB.init(args,null);
//Legge l'object reference dallo standard input
org.omg.CORBA.Object obj=orb.string_to_object(args[0]);
//Creazione dello stub
Message mess_proxy = MessageHelper.narrow(obj);
//Invocazione del servizio remoto
String messaggio=mess_proxy.getMessage();
System.out.println("Messaggio ricevuto dall\'oggetto
servente: "+messaggio); } }
Passo 4: Sviluppo lato servente
Implementazione dell’oggetto servente (servant)
//Classe MessImpl
import org.omg.PortableServer.*; //Package di libreria CORBA
import message.*; //Package generato dalla compilazione IDL
public class MessImpl extends MessagePOA {
public String getMessage() {
//implementazione del metodo astratto della classe
//message.MessagePOA – a cura del programmatore
return ("Salve a tutti \n"); }
}
Implementazione del server
import org.omg.PortableServer.*; //Package di libreria CORBA
public class Server {
public static void main(String[] args) {
try {
//Inizializza l'ORB
org.omg.CORBA.ORB orb =
org.omg.CORBA.ORB.init(args,null);
//Crea l'oggetto servant
MessImpl myservant = new MessImpl();
//Ottiene il riferimento al POA
POA rootPOA =
POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
Implementazione del server
//Registra l'oggetto nel POA
org.omg.CORBA.Object obj =
rootPOA.servant_to_reference(myservant);
//Attiva il POA
rootPOA.the_POAManager().activate();
//Stampa l'object reference sullo standard output
System.out.println(orb.object_to_string(obj));
//Mette l'applicazione servente in stato di attesa
orb.run();
} catch (Exception e) {
e.printStackTrace(); }
}
}
2. La modellazione a oggetti e il linguaggio UML (richiami)
3. Generalità su Java e la programmazione ad oggetti
6. Regole di traduzione da UML a Java/C++
7. Programmazione multi-thread
8. Sincronizzazione tra thread
9. Programmazione client-server con socket TCP/IP (Java networkin...
10. Programmazione di applicazioni client-server: il Pattern Proxy...
12. Design Patterns
13. Pattern architetturali - Esempi
14. Design pattern creazionali. Esempi
15. Design pattern strutturali. Esempi
16. Introduzione alle tecnologie middleware
17. Modelli di middleware: RPC, MOM, TP, TS
Baker S., CORBA Distributed Objects Using Orbix, Addison-Wesley, 1997.
Brose G., Vogel A., Duddy K., Java Programming with CORBA – Advanced Techniques for Building Distributed Applications, 3rd edition, OMG Press, John Wiley & Sons, 2001.
Natarajan V., Reich S., Vasudevan B., Programming with VisiBroker – A Developer’s Guide to VisiBroker for Java, 2nd edition, John Wiley&Sons, 2000.
Orfali R., Harkey D., Client/Server Programming with Java and CORBA, 2nd edition, John Wiley & Sons, 1998.
Siegel J., CORBA 3 – Fundamentals and Programming, 2nd edition, OMG Press, John Wiley & Sons, 2000.
Object Management Group, Common Object Request Broker Architecture (CORBA) v. 2.6, 2001