COCORBA: Anexos
Ingeniería del Software II
Curso 2008/2009
Sergio Ilarri Artigas
Sergio Ilarri Artigas
[email protected]
Índice
Anexo I: Ejemplo HelloWorld
Anexo II: Ejemplo con Objeto callback
Anexo III: Algunos Conceptos Avanzados
Anexo III: Algunos Conceptos Avanzados
Anexo IV: CORBAen Java 1.3
Anexo V: Ejemplos de Mapping de IDL en
Anexo V: Ejemplos de Mapping de IDL en
Java
Anexo VI: Resumen de Terminología
í
d
l
Anexo I
(en Java 1.4)
Ej.: HelloWorld (I)
Pasos
1 - Definir el interfazremoto
1. Definir el interfaz remoto
2.- Compilar el interfazremoto
3.- Implementar el servidor
4.- Implementar el cliente
4. Implementar el cliente
5.- Arrancar la aplicación
http://java.sun.com/j2se/1.5.0/docs/guide/idl/GShome.html
Ej.: HelloWorld (II)
Paso 1: definir el interfaz remoto IDL
Si el servicio ya estuviera implementado tendrían
Si el servicio ya estuviera implementado, tendrían
que pasarnos el interfazIDLpara programar el
cliente
Hello idl
Hello.idl
module HelloApp
{
interface Hello
{
string sayHello();
oneway void shutdown();
()
id h td
};
};
En directorio “HelloApp”
Module: espacio de nombres (package)
Ej.: HelloWorld (III)
Paso 2: compilar el interfazremoto
El IDLpermite independencia del lenguaje
Podríamos usar un compilador IDLde Java
Podríamos usar un compilador IDLde Java
para implementar el cliente en Java y un
compilador IDLde Java para implementar
compilador IDLde Java para implementar
el servidor en C++
idlj -fall Hello.idl
-fall para que cree no sólo los stubsdel
cliente sino también los skeletonsdel
servidor
servidor
Ej.: HelloWorld (IV)
Hello.java:
Versión Java del interfaz IDL
Proporciona funcionalidad de objeto CORBA estándar
Extiende org.omg.CORBA.Object, HelloOperations, y
á
org.omg.CORBA.portable.IDLEntity
HelloHelper.java:
HelloHelper.java:
Downcasting
de interfaces remotos
Funcionalidad requerida para convertir objetos CORBA a sus tipos (narrow)
Responsable de leer y escribir los tipos de/a flujos de datos
También de insertar y extraer valores en un Any
Ficheros
obtenidos
(I)
HelloHolder.java:
HllHld j
Para implementar parámetros out/inout
Encapsula un objeto que implementa Hello
Implementa el interfaz orgomgCORBAportableStreamable
Implementa el interfaz org.omg.CORBA.portable.Streamable
Delega en HelloHelperpara leer y escribir
Proporciona operaciones para argumentos:
org.omg.CORBA.portable.OutputStreamy
orgomgCORBAportableInputStream
org.omg.CORBA.portable.InputStream
Recuerda que en Java, el paso de
parámetros es por valor...
Luego se compilarán con javacy se pondrán en el CLASSPATH
Ej.: HelloWorld (V)
_HelloStub.java(stubdel cliente)
Objeto local representando al remoto
Proporciona la funcionalidad CORBAbásica al cliente
El cliente no lo usa directamente
Extiende org.omg.CORBA.portable.ObjectImpl
á
Implementa el interfaz Hellojava
Implementa el interfaz Hello.java
HelloPOA.java (skeletondel servidor)
Punto de entrada al objeto distribuido
Proporciona la funcionalidad CORBA básica al servidor
Extiende org.omg.PortableServer.Servant
Implementa los interfaces org.omg.CORBA.portable.InvokeHandlery
HelloOperations
HelloOperations.java
HelloOperations.java
Mappingsde las operaciones definidas en el interfaz IDL
Compartido por stubsy skeletons
Ficheros
obtenidos
(II)
Luego se compilarán con javac y se pondrán en el CLASSPATH
Ej.: HelloWorld (VI): Serv.
Paso 3: implementación del lado
id
servidor
Implementar la clase servant
Extiende HelloPOA(skeleton)
Un método por cada operación del IDL
Son métodos Java ordinarios (el código
necesario para operar con el ORB lo
proporciona el skeleton)
proporciona el skeleton)
Implementar la clase servidor:
Pone los servicios de los objetos a disposición
Pone los servicios de los objetos a disposición
de los interesados
Ej.: HelloWorld (VII): Serv.
HelloServer java
HelloServer.java
// HelloServer.java
// Copyright and License
import HelloApp *;
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org omg CORBA *;
import org.omg.CORBA. ;
import org.omg.PortableServer.*;
import java.util.Properties;
...
contiene el skeleton
servicio de nombres
servicio de nombres
excepción servicio
de nombres
necesario para toda
aplicación CORBA
modelo de herencia
modelo de herencia
del Portable Server
propiedades para
iniciar el ORB
iniciar el ORB
Ej.: HelloWorld (VIII): Serv.
HelloServer.java: clase servant
class HelloImpl extends HelloPOA {
b
private ORB orb;
t ORB
i
}
public void setORB(ORB orb_val) {
orb = orb val;
orb
orb_val;
// implement sayHello() method
H ll () {
public String sayHello() {
bli St i
return "\nHello world !!\n";
}
// implement shutdown() method
public void shutdown() {
orb.shutdown(false);
}
}
}
definido por nosotros para
poder guardar una referencia
l ORB(
h td )
al ORB(que se utiliza en shutdown)
tili
Método de org.omg.CORBA.ORB.
Con argumento false, solicita que se
termine el ORBinmediatamente,
sin esperar que termine ningún
procesamiento
ú
Ej.: HelloWorld (IX): Serv.
HelloServer.java: clase servidora
public class HelloServer {
public class HelloServer {
public static void main(String args[]) {
try {
y {
/* Main code here */
}
catch (Exception e) {
System err println("ERROR: " + e);
System.err.println( ERROR: + e);
e.printStackTrace(System.out);
}
System.out.println("HelloServer Exiting ...");
}
}
Desarrollado en las
siguientes
transparencias
captura, en particular,
excepciones CORBA
que puedan producirse
que puedan producirse
Ej.: HelloWorld (X): Serv.
1) Inicializar el ORB (método factoría):
)
)
(
ORB orb = ORB.init(args, null);
Pasamos los argumentos de la línea comandos
para establecer propiedades
String[]
Properties
j
p ,
p p
Por ejemplo, una propiedad estandarizada es
omg.ORB.CORBA.ORBClass, que permite establecer la
implementación de ORB deseada
implementación de ORB deseada
Reflexión
¿Algún patrón de diseño
¿ gú pat ó de d se o
relacionado con esto?
El patrón Factory ¿Ventajas?
Permite “enchufar” cualquier ORBde CORBA
Permite enchufar cualquier ORBde CORBA
Ej.: HelloWorld (XI): Serv.
2) Obtener una referencia al Root POA:
)
POA rootpoa = POAHelper.narrow(orb.resolveinitialreferences("RootPOA"));
));
_ _
p
p
(
(
3) Activar el POAManager:
)
g
Permite obtener referencias
Iniciales a determinados
objetos: RootPOA,
NameService, etc.
rootpoa.the_POAManager().activate();
Hace que los POAs asociados
comiencen a procesar
peticiones
Ej.: HelloWorld (XII): Serv.
4) Instanciar el objeto servant:
HelloImpl helloImpl = new HelloImpl();
5) P
l ORB
5) Pasar una referencia al ORB:
f
i
helloImpl.setORB(orb);
( );
p
Esto lo requiere este ejemplo completo para implementar
el shutdown; también podría ocuparse el servidor y el
el shutdown; también podría ocuparse el servidor y el
objeto remoto simplemente activar un flagpara avisarle
de la necesidad
Ej.: HelloWorld (XIII): Serv.
6) Obtener una referencia al servant:
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
Hellohref=HelloHelpernarrow(ref)
Hello href = HelloHelper.narrow(ref)
7) Obtener el contexto de nombres inicial:
7) Obtener el contexto de nombres inicial:
org.omg.CORBA.Object objRef =
g g
orb.resolve_initial_references("NameService");
j
j
NamingContextExtncRef=NamingContextExtHelpernarrow(objRef);
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
Ej.: HelloWorld (XIV): Serv.
8) Registrar el servanten el servicio de
nombres:
String name = "Hello";
NameComponent path[] = ncRef.to_name(name);
Rf bi d( th h f)
ncRef.rebind(path, href);
Cuando el cliente llame a resolve(“Hello”)en el contexto de
nombres inicial, el servicio de nombres devolverá una referencia de
objeto al servantHello
)
(
Ej.: HelloWorld (XV): Serv.
9) Esperar invocaciones en un bucle:
orb.run();
-Permite al ORBrealizar trabajo utilizando el thread principal del
servidor
-Cuando llegue una invocación del cliente y se complete, el
servidor se pondrá a esperar de nuevo
-El método runtermina la ejecución cuando se haga un
shutdownsobre el ORB
shutdownsobre el ORB
Ej.: HelloWorld (XVI): Cliente
Paso 4: implementar el cliente
HelloClient.java
// HelloClient.java
//C i ht dLi
// Copyright and License
import HelloApp.*;
import org.omg.CosNaming.*;
importorgomgCosNamingNamingContextPackage*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
...
contiene el stub
servicio de nombres
excepción servicio
de nombres
de nombres
necesario para toda
aplicación CORBA
Ej.: HelloWorld (XVII): Cliente
HelloClient.java: clase cliente
publicclassHelloClient{
public class HelloClient {
public static void main(String args[]) {
try {
Desarrollado en las
i
siguientes
transparencias
t
i
captura, en particular,
excepciones CORBA
que puedan producirse
/*Maincodehere*/
/ Main code here /
}
catch (Exception e) {
System.err.println("ERROR: " + e);
eprintStackTrace(Systemout);
e.printStackTrace(System.out);
}
}
}
Ej.: HelloWorld (XVIII): Cliente
1) Inicializar el ORB:
)
ORB orb = ORB.init(args, null);
Pasamos los argumentos de la línea comandos
para establecer propiedades
2) Obtener el contexto de nombres inicial:
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
Comentarios de: CORBA: Anexos - Ingeniería de Software II (0)
No hay comentarios