Corba con Java e IDL

| 2014-05-25 | No hay comentarios »

Common Object Request Broker Architecture (CORBA) es un estándar definido por Object Management Group (OMG) que permite que diversos componentes de software escritos en múltiples lenguajes de programación y que corren en diferentes computadoras, puedan trabajar juntos; es decir, facilita el desarrollo de aplicaciones distribuidas en entornos heterogéneos.

IDL es un lenguaje de definición de interfaces que utiliza CORBA, el cual le permitirá definir las interfaces para los servicios que ofrecerá, de estas interfaces parten las implementaciones de la parte servidor y cliente en cualquiera de los diversos lenguajes que implementan CORBA (Ada, C, C++, Smalltalk, Java, Python, Perl). 

Comenzamos con la implementación (El ejemplo es para realizar una suma): 

PASO 1: Preparar la aplicación 
Crear una carpeta donde prefieran para trabajar las clases dentro de ella.

PASO 2: Definir la interfaz IDL 
ya dentro de la carpeta crearemos un archivo llamado Suma.idl con cualquier editor de texto:

 module sumaApp{
 interface suma{ 
 long sumar(in long primernumero, in long segundonumero);
 oneway void shutdown();
 }; 
 };

Esta definición es parecida a la definición que se hace con RPC (con xdr), lo que se hace es definir los métodos que se van a utilizan.

PASO 3: Generar las clases CORBA 
Para generar las clases corba utilizaremos el compilador de interfaces que viene con el sdk de java se llama idlj, al ejecutar esta aplicación en conjunto con la definición suma.idl creara para nosotros todas las clases necesarias para poder utilizarla. El procedimiento es como sigue: 

idlj -fall suma.idl (ejecutar dentro de la carpeta de la aplicación)

Esto generara la carpeta sumaApp y dentro de ella las clases _SumaStub.java, Suma.java, SumaHelper.java, SumaHolder.java, SumaOperations.java, SumaPOA.java

* Si no les reconoce el idlj tendrán que agregar el sdk de java al path del sistema operativo que tengan.

Solo queda escribir la clase cliente y la clase servidor dentro de carpeta de la aplicación

PASO 4: La clase servidor: SumaServer.java


import sumaApp.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

 class SumaImpl extends sumaPOA{
 private ORB orb;
 public void setORB(ORB orb_val){
 orb=orb_val;
 }

 public int sumar(int primernumero, int segundonumero){
 return primernumero+segundonumero;
 }

 public void shutdown(){
 orb.shutdown(false);
 }
 }

 public class SumaServer {

 public static void main(String args[]){
 try{
 ORB orb= ORB.init(args,null);
 POA rootpoa=POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
 rootpoa.the_POAManager().activate();

 SumaImpl sumaImpl=new SumaImpl();
 sumaImpl.setORB(orb);

 org.omg.CORBA.Object ref=rootpoa.servant_to_reference(sumaImpl);
 suma href=sumaHelper.narrow(ref);
 org.omg.CORBA.Object objRef=orb.resolve_initial_references("NameService");
 NamingContextExt ncRef=NamingContextExtHelper.narrow(objRef);

 String name="Suma";
 NameComponent path[]=ncRef.to_name(name);
 ncRef.rebind(path, href);
 System.out.println("Servidor de suma listo y en espera");
 orb.run();
 }catch(Exception e){
 System.err.println("Error: "+e);
 e.printStackTrace(System.out);
 }

 System.out.println("Adios cerrando servidor");
 }
 }

si vemos detenidamente el código en este archivo notaremos que se implementan dos clasesSumaImpl y SumaServer, SumaImpl es la que se encarga de implementar los métodos declarados en la interface en el archivo idl que definimos al principio. La clase SumaServer se encarga de generar las llamadas a los métodos corba haciendo referencia siempre a la clase SumaImpl que es la que llevara toda la lógica de la aplicación. Es decir que la clase SumaServer en si es repetitiva a diferencia de la clase SumaImpl que es donde implementaremos la logica de los métodos que utilizaremos 

* No explicare el código ya que por ser pequeño asumiré que es entendible 

PASO 5: la clase Cliente: SumaClient.java


import sumaApp.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class SumaClient {
 static suma sumaImpl;
 public static void main(String args[]){
 try{
 ORB orb= ORB.init(args,null);
 org.omg.CORBA.Object objRef=orb.resolve_initial_references("NameService");
 NamingContextExt ncRef= NamingContextExtHelper.narrow(objRef);

 String name="Suma";
 sumaImpl=sumaHelper.narrow(ncRef.resolve_str(name));
 //System.out.println("Obteniendo las cabeceras del objeto servidor: "+sumaImpl);
 System.out.println("suma es:"+Integer.toString(sumaImpl.sumar(20, 30)));
 sumaImpl.shutdown();
 }catch(Exception e){
 System.out.println("Error: "+e);
 e.printStackTrace(System.out);
 }
 }
 }

ULTIMO PASO: Probar ejemplo

-Compilar nuestras clases para ello usaremos la siguiente línea estando dentro de la carpeta donde esta nuestra aplicación: 
javac *.java sumaApp/*.java 

Ahora iniciaremos el servicio orbd (asegúrense de ser administradores sino no podrán iniciar el servicio), la linea es la siguiente: 
orbd -ORBInitialPort 1080 

* ordb.exe viene en la carpeta bin del sdk de java 

Si todo salió bien el servicio orbd se iniciara escuchando en el puerto 1080 (ustedes pueden elegir que puerto usar de los 65000 disponibles) 

Ahora tenemos que iniciar nuestro servidor de sumas dentro del servicio orbd, la línea es la siguiente:
java SumaServer -ORBInitialPort 1080 -ORBInitialHost localhost 

Si les sale el mensaje: “servidor de suma listo y en espera” todo va muy bien.

Como paso final: Ejecutar el cliente para verificar que todo funcione, la línea es como sigue: 
java SumaClient -ORBInitialPort 1080 -ORBInitialHost localhost 

Debería de mostrarnos en pantalla el texto “la suma es : 50”, ya que como parámetros le pasamos 30 y 20 en el código del cliente.

Solo por cuestiones de pedagogía ejecutamos el cliente y servidor de forma local, pero pueden probar hacerlo de forma remota, yo lo hice y funcionó sin problemas.

Espero les pueda servir éste artículo, hasta la próxima.

Acerca del autor: Rodrigo Paszniuk

Ingeniero Informático, amante de la tecnología, la música, el ciclismo y aprender cosas nuevas.

Posts Relacionados

  • Electron, framework Javascript para crear aplicaciones de escritorio
  • JSF 2 con Maven – Hola Mundo
  • Java RMI
  • Gestión de cambios de la base de datos – Liquibase