Desenvolvimento de Aplicações Java/CORBA



Documentos relacionados
Objetos distribuídos. Roteiro. Java IDL

Laboratório de Computação VI JAVA IDL. Fabricio Aparecido Breve

Uma Introdução à Arquitetura CORBA. O Object Request Broker (ORB)

DAS Sistemas Distribuídos & Redes

Invocação de Métodos Remotos RMI (Remote Method Invocation)

Java 2 Standard Edition. Fundamentos de. Objetos Remotos. Helder da Rocha

! "# $ $ % & % ' & ( )

UNIVERSIDADE. Sistemas Distribuídos

Sistemas Distribuídos

Chamadas Remotas de Procedimentos (RPC) O Conceito de Procedimentos. RPC: Programa Distribuído. RPC: Modelo de Execução

SISTEMAS DISTRIBUÍDOS

Sistemas Paralelos e Distribuídos /2004 Curso: Matemática /Informática Sistemas Distribuídos /2004 Curso: Ensino da Informática

Invocação de Métodos Remotos

Tutorial RMI (Remote Method Invocation) por Alabê Duarte

Num sistema de objectos distribuídos, dois conceitos são fundamentais.

Sistemas Distribuídos Métodos de Invocação Remota II. Prof. MSc. Hugo Souza

APÊNDICE A EXEMPLO DE APLICAÇÃO

INE Sistemas Distribuídos

Objetos Distribuídos - Programação Distribuída Orientado a Objetos. Luiz Affonso Guedes

Sistemas Distribuídos

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

MIDDLEWARE Aplicativos RMI, RPC e eventos Camadas Protocolo Requesição-Respostal Middleware Representação Externa dos Dados Sistemas Operacionais

Object Brokers. Tecnologias de Middleware 2004/2005 André Santos

Projeto de Software Orientado a Objeto

Desenvolvendo uma aplicação CORBA utilizando Java

Aplicações e Arquitetura CORBA. Edvar Oliveira edvar@ufpa.br

Sistemas Distribuídos Métodos de Invocação Remota IV. Prof. MSc. Hugo Souza

Grupo I [6v] Considere o seguinte extracto de um programa de definição de uma calculadora apenas com a função soma de dois valores reais

Java : Comunicação Cliente-Servidor.

CURSO DE PROGRAMAÇÃO EM JAVA

Prática em Laboratório N.01 Criando um Serviço Web via Console

Java 2 Standard Edition Como criar classes e objetos

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

INF1013 MODELAGEM DE SOFTWARE

Aula 30 - Sockets em Java

MicroDNS. Armando Adami Zaro Pablo Augusto Lerina Rodrigues. 3 de outubro de 2007

Middleware de Aplicações Paralelas/Distribuídas

Programação Orientada a Objetos em Java

Bacharelado em Ciência e Tecnologia BC Processamento da Informação Teoria Arquivos Prof. Edson Pinheiro Pimentel edson.pimentel@ufabc.edu.

Invocação Remota MC704

COMUNICAÇÃO INTER-PROCESSOS JAVA RMI e RPC. Prof. Cesar Augusto Tacla

Um pouco do Java. Prof. Eduardo

Capítulo VI CORBA. Common Object Request Broker Architecture. [Cardoso2008] Programação de Sistemas Distribuídos em Java, Jorge Cardoso, FCA, 2008.

Enterprise Java Beans

Threads e Sockets em Java. Threads em Java. Programas e Processos

Exercícios de Revisão Java Básico

Universidade Federal de Juiz de Fora Ciência da Computação Sistemas Distribuídos Professor Ciro Barbosa

Sistemas Distribuídos. Ricardo Ribeiro dos Santos

Introdução ao IDE Netbeans (Programação Java)

1 a. Sumário. 1. Conceitos Básicos a. Invocação remota (RPC/RMI) b. Semântica de invocação remota c. Invocação remota de métodos (RMI)

Adriano Reine Bueno Rafael Barros Silva

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

Grupo I [7v] 1. [1,0] Apresente o conteúdo do IDL relativo a este programa. Assuma PROGRAM=62015 e VERSION=1.

Java. Marcio de Carvalho Victorino

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

THREADS EM JAVA. George Gomes Cabral

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Prática em Laboratório N.02 Criando um serviço Web via NetBeans

Sistemas Distribuídos

2 Orientação a objetos na prática

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Java RMI. Alcides Calsavara

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

Linguagem de Programação III

Manipulação de Banco de Dados com Java 1. Objetivos

Exercício 1 : As classes abaixo serão utilizadas neste exercício: public class Ponto { int x; int y; public Ponto(int x, int y){ this.

Persistência de Classes em Tabelas de Banco de Dados

Padrões de Projeto. Singleton

Sistemas Distribuídos Arquiteturas Middlewares

OProtocolo RPC é um dos protocolos de aplicação mais utilizados, pois permite

Tutorial Mozilla Thunderbird 1.5

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação

Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos

Java JDBC - I. Ex. 2: para o SQLServer da Microsoft, o driver JDBC pode ser obtido em

Universidade da Beira Interior. Sistemas Distribuídos

Programação Paralela e Distribuída. Prof. Cidcley T. de Souza

Sobre o Professor Dr. Sylvio Barbon Junior

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Sistemas Distribuídos: Conceitos e Projeto Java RMI

Manual do usuário. Softcall Java. versão 1.0.5

Arquitetura de Aplicações JSP/Web. Padrão Arquitetural MVC

Analisar os sistemas operacionais apresentados na figura e responder as questões abaixo: Identificar

Invocação de Métodos em Objectos Remotos

Exemplo 1. Um programa que cria uma instância de uma classe que herda da classe Frame

Sistemas Distribuídos

Guia de Fatores de Qualidade de OO e Java

Satélite. Manual de instalação e configuração. CENPECT Informática cenpect@cenpect.com.br

NetBeans. Conhecendo um pouco da IDE

Simulado de Linguagem de Programação Java

Java Spaces Exemplos

UNIVERSIDADE. Sistemas Distribuídos

Objetivos: Entender o funcionamento dos programas Java via linha de comando

Java para Desenvolvimento Web

Transcrição:

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

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 por um 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 uma forma 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 uma cadeia de caracteres, informando ao objeto que requisitou o método uma mensagem de confirmaçã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 (JacORB 1 1.4) Para compilar a IDL basta executar o seguinte comando: idl tutorial.idl 1 Para este exemplo foi usado o ORB JacORB 1.4, disponível em http://www.jacorb.org, porém pode-se utilizar qualquer ORB que esteja de acordo com a especificação CORBA v2.3 2

O compilador IDL do JacORB irá gerar 6 arquivos em um sub-diretório com o mesmo nome 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 a funcionalidade dos objetos CORBA. O arquivo correio.java: /** * 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{ IDL interface correio module tutorial O mapeamento das sentenças em IDL para JAVA. correiooperations.java Java public interface correio Esta classe contem os métodos da interface correio (enviar_msg(mensagem email)). Todas as operações definidas na interface IDL são mapeadas para Java e colocadas no arquivo de operações. Para a interface correio, o arquivo correspondente seria: /** * Generated from IDL definition of interface "correio" * @author JacORB IDL compiler */ public interface correiooperations { /* constants */ /* operations */ 3

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çãoda 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_msg possui como parâmetro uma estrutura (definida na IDL e que é mapeada para uma classe em Java) mensagem. Implementaçãodo Servidor(Servidor.java) A implementação do servidor deve: Iniciar o ORB; 4

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 o nome Servidor-email ; Aguardar pelas invocações dos clientes ao objeto. Implementaçãodo 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" no serviç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á esteja preparado, 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: 5

$ 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 6

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 public class correioimpl extends correiopoa{ // Constructor correioimpl(){ System.out.println("Objeto correio criado com sucesso!"); public String enviar_msg(mensagem email) { 7

\n"); System.out.println("\n...::: Recebimento de mensagem :::... 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 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 ligação (bind) do objeto ao nome no serviço de NameComponent [] name = new NameComponent[1]; name[0] = new NameComponent("Servidor-Correio", ""); 8

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 System.err.println("ERROR: " + e); Arquivo: Cliente.java 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 9

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{ 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