Sei sulla pagina 1di 10

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

Tutorial
Desenvolvimento de Aplicaes Java/CORBA
Emerson Ribeiro de Mello, Fbio Favarim e Joni da Silva Fraga {emerson, fabio, fraga}@das.ufsc.br Este tutorial ensina como criar uma aplicao distribuda CORBA utilizando o JacORB. O exemplo abordado neste tutorial um simples sistema de envio de mensagens eletrnicas, trocadas entre um cliente e um servidor. Com este exemplo possvel conhecer todas as tarefas envolvidas em uma aplicao distribuda. Os passos a seguir mostram resumidamente, o que est envolvido no processo desenvolvimento uma aplicao distribuda CORBA: 1. Definio da interface remota do objeto Deve-se definir primeiramente a interface remota do objeto usando a Linguagem de Definio de Interface da OMG (IDL-Interface Definition Language). 2. Compilao da IDL Nesta etapa sero gerados os cdigos Java da interface, assim como os stubs e skeletons do objeto. 3. Implementao da interface (servant) Nesta etapa implementado em JAVA a interface descrita na IDL. A implementao da interface denominada servant. 4. Implementao do servidor Que responsvel por criar os objetos e por registra-los no servio de nomes, assim como aguardar pelas invocaes dos clientes remotos. O servidor usa os skeletons gerados pelo compilador IDL, para facilitar a comunicao. 5. Implementao do cliente O cliente responsvel por obter a referncia para o objeto remoto e fazer a chamada aos mtodos. Similarmente ao servidor, o cliente usa os Stubs gerados pelo compilador IDL como base da aplicao cliente. 6. Compilando e executando as aplicaes Compilao das classes

1
http://www.das.ufsc.br/~emerson/estagio

DAS5331

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

Iniciar o servio de nomes Executar o servidor Executar o cliente

Desenvolvimento da Aplicao
Descrio
Um sistema de envio de mensagens eletrnica, onde as mensagens so compostas por um emissor, destinatrio, assunto e corpo da mensagem. O lado servidor da aplicao ser responsvel por receber as mensagens enviadas pelo lado cliente. O cliente dever fornecer uma forma de que se possa compor um mensagem e envi-la para o servidor.

Definio da Interface
O servidor possui o mtodo enviar_msg(mensagem email), que tem como retorno uma cadeia de caracteres, informando ao objeto que requisitou o mtodo uma mensagem de confirmao indicando se a comunicao foi ou no bem sucessida. Escrevendo a interface IDL (tutorial.idl)
module tutorial { struct mensagem{ string emissor; string destinatario; string assunto; string corpo; }; interface correio{ string enviar_msg(in mensagem email); }; };

Compilando a IDL (JacORB1 1.4) Para compilar a IDL basta executar o seguinte comando:
idl tutorial.idl

Para este exemplo foi usado o ORB JacORB 1.4, disponvel em http://www.jacorb.org , porm pode-se utilizar qualquer ORB que esteja de acordo com a especificao CORBA v2.3

2
http://www.das.ufsc.br/~emerson/estagio

DAS5331

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB O compilador IDL do JacORB ir gerar 6 arquivos em um sub-diretrio com o mesmo nome do mdulo definido na IDL : tutorial.
correio.java

Esta interface contem a verso Java da interface correio (correio.idl). A classe correio.java estende a interface org.omg.CORBA.Object, para fornecer a funcionalidade dos objetos CORBA.

O arquivo correio.java:
package tutorial; /** * * */ Generated from IDL definition of interface "correio" @author JacORB IDL compiler

public interface correio extends correioOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity{}

O mapeamento das sentenas em IDL para JAVA. IDL


interface correio module tutorial correioOperations.java

Java
public interface correio package tutorial;

Esta classe contem os mtodos da interface correio (enviar_msg(mensagem email)). Todas as operaes definidas na interface IDL so mapeadas para Java e colocadas no arquivo de operaes. Para a interface correio, o arquivo correspondente seria:
package tutorial; /** * * */ Generated from IDL definition of interface "correio" @author JacORB IDL compiler

public interface correioOperations { /* constants */ /* operations */ java.lang.String enviar_msg(tutorial.mensagem email); }

3
http://www.das.ufsc.br/~emerson/estagio

DAS5331

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

correioPOA.java

Esta classe o skeleton do servidor, responsvel por fornecer a funcionalidade bsica do CORBA para o servidor.
_correioStub.java

Esta classe o stub do cliente, responsvel por fornecer a funcionalidade bsica do CORBA para o cliente.
correioHelper.java

Esta classe fornece operaes auxiliares, como a operao narrow(), necessria para fazer o cast de uma referncia de objeto CORBA para o tipo correio.
correioHolder.java

Esta classe fornece operaes para argumentos do tipo out e inout. Restando ento implementar os cdigos para os mtodos da interface correio (correioImpl.java) definidos na IDL, e os cdigos do Servidor (Servidor.java) e do Cliente (Cliente.java)

Implementaes
Todas os cdigos utilizados neste tutorial esto neste documento como anexos.

Implementao da Inteface (correioImpl.java)


A classe correioImpl deve implementar todos os mtodos da interface correio. Cada instncia de correio implementada pela correioImpl. O mtodo enviar_msg possui como parmetro uma estrutura (definida na IDL e que mapeada para uma classe em Java) mensagem.

Implementao do Servidor (Servidor.java)


A implementao do servidor deve:

Iniciar o ORB; Criar uma instncia da implementao do objeto CORBA correio Transformar o objeto em uma referncia para objeto CORBA; 4 DAS5331

http://www.das.ufsc.br/~emerson/estagio

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB


Obter a referncia do servio de nomes; Registrar o novo objeto no servidor servio de nomes, usando por exemplo o nome Servidor-email; Aguardar pelas invocaes dos clientes ao objeto.

Implementao do Cliente (Cliente.java)


A implementao do cliente deve:

Inicializar o ORB; Obter a referncia do servio de nomes; Procurar pelo objeto que tenha sido registrado com o nome "Servidor-email" no servio de nomes e recuperar a referncia do objeto; Converter o objeto para o tipo de sua interface (correioHelper.narrow(obj)); Invocar os mtodos no objeto.

Compilando e executando o exemplo


Para que seja possvel compilar e executar o exemplo importante que o ambiente j esteja preparado, ou seja, que todas as variveis de ambientes necessrias j tenham sido configuradas. Todos os passos para preparao do ambiente no LCMI so descritos no documento guialocal.pdf que pode ser obtido em: http://www.das.ufsc.br/~emerson/java-corba , juntamente com os cdigos fontes do exemplo descrito aqui.

Compilando a IDL:
$ idl tutorial.idl

Compilando os arquivos .java:


$ javac tutorial/*.java

Iniciando o servio de nomes (NS)


5
http://www.das.ufsc.br/~emerson/estagio

DAS5331

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

$ ns

Executando o servidor
Abra uma nova shell: $ jaco tutorial.Servidor

Executando o cliente
Abra uma nova shell $ jaco tutorial.Cliente

6
http://www.das.ufsc.br/~emerson/estagio

DAS5331

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB

Anexos
Arquivo: tutorial.idl
// Arquivo IDL /* Descrio: Um sistema para envio de mensagens contendo um emissor, destinatario, um assunto e a mensagem propriamente dita. */ module tutorial{ struct mensagem{ string emissor; string destinatario; string assunto; string corpo; }; interface correio{ string enviar_msg(in mensagem email); }; };

Arquivo: correioImpl.java
package tutorial; public class correioImpl extends correioPOA{ // Constructor correioImpl(){ System.out.println("Objeto correio criado com sucesso !"); } public String enviar_msg(mensagem email) { System.out.println("\n...::: Recebimento de mensagem :::...\n"); System.out.println("De: "+email.emissor); System.out.println("Para: "+email.destinatario);

7
http://www.das.ufsc.br/~emerson/estagio

DAS5331

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB


System.out.println("Assunto: "+email.assunto); System.out.println("Mensagem: "+email.corpo); System.out.println("...::: Fim da mensagem :::..."); } return("Mensagem enviada com sucesso");

Arquivo: Servidor.java
package tutorial; import org.omg.CosNaming.*; class Servidor{ static public void main(String[] args){ try { // Inicia o ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); // Pega a referencia do POAManager e o inicializa org.omg.PortableServer.POA rootpoa = org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_ references("RootPOA")); rootpoa.the_POAManager().activate(); // Cria o objeto correioImpl objCorreio = new correioImpl(); // Transforma o objeto local em uma referencia CORBA org.omg.CORBA.Object ref = rootpoa.servant_to_reference(objCorreio); correio correioRef = correioHelper.narrow(ref); // Obtem a referencia do servico de nomes org.omg.CORBA.Object nsRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(nsRef); nomes // Faz a ligao (bind) do objeto ao nome no servio de NameComponent [] name = new NameComponent[1]; name[0] = new NameComponent("Servidor-Correio", ""); ncRef.rebind(name, correioRef); // Executa o ORB e fica aguardando pelas invocacoes dos

clientes

System.out.println("Servidor de Correio iniciado com sucesso....\n\n"); orb.run(); }catch (Exception e) { //Caso ocorra algum erro

8
http://www.das.ufsc.br/~emerson/estagio

DAS5331

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB


} System.err.println("ERROR: " + e);

Arquivo: Cliente.java
package tutorial; import org.omg.CosNaming.*; class Cliente{ static correio objCorreio; static public void main(String[] args){ try { // inicializa o ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); // Obtem a referencia do servico de nomes org.omg.CORBA.Object nsRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(nsRef); // Busca pelo nome no servio de nomes NameComponent [] name = new NameComponent[1]; name[0] = new NameComponent("Servidor-Correio", ""); org.omg.CORBA.Object objRef = ncRef.resolve(name); // Converte o objeto para o tipo da interface correio objCorreio = correioHelper.narrow(objRef); //Chama o menu interativo menu(); }catch(Exception e) { //Em caso de algum erro System.err.println("\n\n Atencao - Nao foi possivel enviar a mensagem"); System.err.println("System Exception: "+e); } }

public static void menu(){ java.io.BufferedReader teclado = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); String linha = ""; try{

9
http://www.das.ufsc.br/~emerson/estagio

DAS5331

Desenvolvendo aplicao distribuda CORBA utilizando o JacORB


while (!linha.equals("2")) { System.out.println("\n..:: Correio eletronico ::..\n"); System.out.println("1 - Enviar nova mensagem"); System.out.println("2 - Sair\n"); System.out.print("Entre com a opcao: "); try{ linha = teclado.readLine(); }catch(java.io.IOException e){ System.err.println("ERRO DE IO: "+e); } if (linha.equals("1")){ mensagem msg = new mensagem(); System.out.print("\nDe: "); msg.emissor = teclado.readLine(); System.out.print("Para: "); msg.destinatario = teclado.readLine(); System.out.print("Assunto: "); msg.assunto = teclado.readLine(); System.out.print("Corpo: "); msg.corpo = teclado.readLine(); // Invocacao do metodo enviar_msg; System.out.println(objCorreio.enviar_msg(msg)); } } }catch(Exception e){ System.err.println("System Exception: "+e); } }

10
http://www.das.ufsc.br/~emerson/estagio

DAS5331