tutorial

10
Desenvolvendo aplicação distribuída CORBA utilizando o JacORB Tutorial Desenvolvimento de Aplicações Java/CORBA Emerson Ribeiro de Mello, Fábio Favarim e Joni da Silva Fraga {emerson, fabio, fraga}@das.ufsc.br Este tutorial ensina como criar uma aplicação distribuída CORBA utilizando o JacORB. O exemplo abordado neste tutorial é um simples sistema de envio de mensagens eletrônicas, trocadas entre um cliente e um servidor. Com este exemplo é possível conhecer todas as tarefas envolvidas em uma aplicação distribuída. Os passos a seguir mostram resumidamente, o que está envolvido no processo desenvolvimento uma aplicação distribuída CORBA: 1. Definição da interface remota do objeto Deve-se definir primeiramente a interface remota do objeto usando a Linguagem de Definição de Interface da OMG (IDL-Interface Definition Language). 2. Compilação da IDL Nesta etapa serão gerados os códigos Java da interface, assim como os stubs e skeletons do objeto. 3. Implementação da interface (servant) Nesta etapa é implementado em JAVA a interface descrita na IDL. A implementação da interface é denominada servant. 4. Implementação do servidor Que é responsável por criar os objetos e por registra-los no serviço de nomes, assim como aguardar pelas invocações dos clientes remotos. O servidor usa os skeletons gerados pelo compilador IDL, para facilitar a comunicação. 5. Implementação do cliente O cliente é responsável por obter a referência para o objeto remoto e fazer a chamada aos métodos. Similarmente ao servidor, o cliente usa os Stubs gerados pelo compilador IDL como base da aplicação cliente. 6. Compilando e executando as aplicações Compilação das classes 1 http://www.das.ufsc.br/~fabio/java-corba/

Upload: fabricio-maciel

Post on 28-Jan-2016

212 views

Category:

Documents


0 download

DESCRIPTION

corba com java

TRANSCRIPT

Page 1: Tutorial

Desenvolvendo aplicação distribuída CORBA utilizando o JacORB

Tutorial

Desenvolvimento de Aplicações Java/CORBA

Emerson Ribeiro de Mello, Fábio Favarim e Joni da Silva Fraga{emerson, fabio, fraga}@das.ufsc.br

Este tutorial ensina como criar uma aplicação distribuída CORBA utilizando o JacORB.O exemplo abordado neste tutorial é um simples sistema de envio de mensagens eletrônicas,trocadas entre um cliente e um servidor. Com este exemplo é possível conhecer todas as tarefasenvolvidas em uma aplicação distribuída.

Os passos a seguir mostram resumidamente, o que está envolvido no processodesenvolvimento uma aplicação distribuída CORBA:

1. Definição da interface remota do objeto Deve-se definir primeiramente a interface remota do objeto usando a Linguagem deDefinição de Interface da OMG (IDL-Interface Definition Language).

2. Compilação da IDL Nesta etapa serão gerados os códigos Java da interface, assim como os stubs eskeletons do objeto.

3. Implementação da interface (servant)Nesta etapa é implementado em JAVA a interface descrita na IDL. A implementaçãoda interface é denominada servant.

4. Implementação do servidor Que é responsável por criar os objetos e por registra-los no serviço de nomes, assimcomo aguardar pelas invocações dos clientes remotos. O servidor usa os skeletonsgerados pelo compilador IDL, para facilitar a comunicação.

5. Implementação do clienteO cliente é responsável por obter a referência para o objeto remoto e fazer a chamadaaos métodos. Similarmente ao servidor, o cliente usa os Stubs gerados pelocompilador IDL como base da aplicação cliente.

6. Compilando e executando as aplicações• Compilação das classes

1http://www.das.ufsc.br/~fabio/java-corba/

Page 2: Tutorial

Desenvolvendo aplicação distribuída CORBA utilizando o JacORB

• Iniciar o serviço de nomes• Executar o servidor• Executar o cliente

Desenvolvimento da Aplicação

Descrição

Um sistema de envio de mensagens eletrônica, onde as mensagens são compostas porum emissor, destinatário, assunto e corpo da mensagem. O lado servidor da aplicação seráresponsável por receber as mensagens enviadas pelo lado cliente. O cliente deverá fornecer umaforma de que se possa compor um mensagem e enviá-la para o servidor.

Definição da Interface

O servidor possui o método enviar_msg(mensagem email), que tem como retorno umacadeia de caracteres, informando ao objeto que requisitou o método uma mensagem deconfirmação indicando se a comunicação foi ou não 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

1Para este exemplo foi usado o ORB JacORB 1.4, disponível em http://www.jacorb.org , porém pode-se utilizarqualquer ORB que esteja de acordo com a especificação CORBA v2.3

2http://www.das.ufsc.br/~fabio/java-corba/

Page 3: Tutorial

Desenvolvendo aplicação distribuída CORBA utilizando o JacORB

O compilador IDL do JacORB irá gerar 6 arquivos em um sub-diretório com o mesmonome do módulo definido na IDL : tutorial.

correio.java Esta interface contem a versão Java da interface “correio” (correio.idl). A

classe correio.java estende a interface org.omg.CORBA.Object, para fornecer afuncionalidade 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 sentenças em IDL para JAVA.

IDL Javainterface correio public interface correiomodule tutorial package tutorial;

correioOperations.java

Esta classe contem os métodos da interface correio (enviar_msg(mensagememail)). Todas as operações definidas na interface IDL são mapeadas para Java ecolocadas no arquivo de operações. Para a interface correio, o arquivo correspondenteseria:

package tutorial;

/** * Generated from IDL definition of interface "correio" * @author JacORB IDL compiler */

public interface correioOperations {/* constants *//* operations */

3http://www.das.ufsc.br/~fabio/java-corba/

Page 4: Tutorial

Desenvolvendo aplicação distribuída CORBA utilizando o JacORB

java.lang.String enviar_msg(tutorial.mensagem email);

}

correioPOA.java Esta classe é o skeleton do servidor, responsável por fornecer a funcionalidade

básica do CORBA para o servidor.

_correioStub.java Esta classe é o stub do cliente, responsável por fornecer a funcionalidade básica

do CORBA para o cliente.

correioHelper.java Esta classe fornece operações auxiliares, como a operação narrow(),

necessária para fazer o cast de uma referência de objeto CORBA para o tipo correio.

correioHolder.java Esta classe fornece operações para argumentos do tipo out e inout.

Restando então implementar os códigos para os métodos da interface “correio”(correioImpl.java) definidos na IDL, e os códigos do Servidor (Servidor.java)e do Cliente (Cliente.java)

Implementações

Todas os códigos utilizados neste tutorial estão neste documento como anexos.

Implementação da Inteface (correioImpl.java)A classe correioImpl deve implementar todos os métodos da interface correio.

Cada instância de correio é implementada pela correioImpl. O método enviar_msgpossui como parâmetro uma estrutura (definida na IDL e que é mapeada para uma classe emJava) mensagem.

Implementação do Servidor (Servidor.java)

A implementação do servidor deve:

• Iniciar o ORB;

4http://www.das.ufsc.br/~fabio/java-corba/

Page 5: Tutorial

Desenvolvendo aplicação distribuída CORBA utilizando o JacORB

• Criar uma instância da implementação do objeto CORBA correio

• Transformar o objeto em uma referência para objeto CORBA;

• Obter a referência do serviço de nomes;

• Registrar o novo objeto no servidor serviço de nomes, usando por exemplo onome “Servidor-email”;

• Aguardar pelas invocações dos clientes ao objeto.

Implementação do Cliente (Cliente.java)

A implementação do cliente deve:

• Inicializar o ORB;

• Obter a referência do serviço de nomes;

• Procurar pelo objeto que tenha sido registrado com o nome "Servidor-email" noserviço de nomes e recuperar a referência do objeto;

• Converter o objeto para o tipo de sua interface (correioHelper.narrow(obj));

• Invocar os métodos no objeto.

Compilando e executando o exemplo

Para que seja possível compilar e executar o exemplo é importante que o ambiente já estejapreparado, ou seja, que todas as variáveis de ambientes necessárias já tenham sido configuradas.Todos os passos para preparação do ambiente no LCMI são descritos no documento“guialocal.pdf” que pode ser obtido em: http://www.das.ufsc.br/~emerson/java-corba ,juntamente com os códigos fontes do exemplo descrito aqui.

Compilando a IDL:

$ idl tutorial.idl

Compilando os arquivos .java:

5http://www.das.ufsc.br/~fabio/java-corba/

Page 6: Tutorial

Desenvolvendo aplicação distribuída CORBA utilizando o JacORB

$ javac tutorial/*.java

Iniciando o serviço de nomes (NS)

$ ns

Executando o servidor

Abra uma nova shell:

$ jaco tutorial.Servidor

Executando o cliente

Abra uma nova shell

$ jaco tutorial.Cliente

6http://www.das.ufsc.br/~fabio/java-corba/

Page 7: Tutorial

Desenvolvendo aplicação distribuída CORBA utilizando o JacORB

Anexos

Arquivo: tutorial.idl

// Arquivo IDL/* Descrição: 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) {

7http://www.das.ufsc.br/~fabio/java-corba/

Page 8: Tutorial

Desenvolvendo aplicação distribuída CORBA utilizando o JacORB

System.out.println("\n...::: Recebimento de mensagem :::...\n"); System.out.println("De: "+email.emissor); System.out.println("Para: "+email.destinatario); 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);

// Faz a ligação (bind) do objeto ao nome no serviço denomes NameComponent [] name = new NameComponent[1]; name[0] = new NameComponent("Servidor-Correio", "");

8http://www.das.ufsc.br/~fabio/java-corba/

Page 9: Tutorial

Desenvolvendo aplicação distribuída CORBA utilizando o JacORB

ncRef.rebind(name, correioRef);

// Executa o ORB e fica aguardando pelas invocacoes dosclientes System.out.println("Servidor de Correio iniciado comsucesso....\n\n"); orb.run(); }catch (Exception e) { //Caso ocorra algum erro 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 serviço 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

9http://www.das.ufsc.br/~fabio/java-corba/

Page 10: Tutorial

Desenvolvendo aplicação distribuída CORBA utilizando o JacORB

System.err.println("\n\n Atencao - Nao foi possivel enviar amensagem");

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{ 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); } }

10http://www.das.ufsc.br/~fabio/java-corba/