Aquiles Burlamaqui Luiz Eduardo Agenda • Motivação • Objetivo • História • Visão Geral • Arquitetura • Passo a Passo Motivação: • Socket Desenvolvimento lento • RPC Procedural Dependente de linguagem • RMI O.O Dependente de Linguagem • Suporte a diversas linguagens, possibilitando a comunicação entre módulos escritos em linguagens distintas Objetivo • Tornar fácil a implementação de aplicações distribuídas • Para sistemas Orientado a Objetos e procedurais • Independentes de: plataforma sistema operacional linguagem de programação protocolo de comunicação • Permitindo chamadas de procedimento remoto como se fossem locais História • 1991 - CORBA 1.0 – ORB • 1996 – CORBA 2.0 – Comunicação entre ORBs • 2002 – CORBA 3.0 Interoperação outros sistemas distribuídos suporte de interação assíncrona entre objetos, mobilidade de objetos interação com grupos de objetos interação em tempo real, etc. História • OMG A arquitetura CORBA é desenvolvida pela OMG (Object Management Group). www.omg.org A OMG foi fundada em 1989 por oito membros fundadores (3Com, American Airlines, Canon, Data General, HP, Philips, Sun e Unisys). No ano 2000 tinha mais de 800 membros, incluindo IBM e Microsoft (apenas como observadora). CORBA - Common Object Request Broker Architecture, Especificação que permite aos objetos de sistemas distribuídos comunicarem-se entre si de forma transparente Componentes principais da OMA • Object Management Architecture Objetos da aplicação Facilidades CORBA Serviços de Objeto ORB Conceito de ORB (Object Request Broker) • componente que auxilia o cliente a invocar um método em um objeto de forma transparente (transparência de acesso) localização do objeto ativação do objeto se necessário comunicar ao objeto sobre a requisição do cliente Chamada através de um ORB Objetivo: possibilitar que clientes invoquem métodos a objetos remotos (objetos CORBA), e que ambos possam ser implementados em linguagens distintas A linguagem de implementação do cliente não precisa ser necessariamente orientada a objetos Funcionalidades • invocações estáticas interface remota do objeto CORBA é conhecida em tempo de compilação (utilização dos stubs e skeletons) • invocações dinâmicas interface remota do objeto CORBA não é conhecida em tempo de compilação Estrutura de um ORB Semântica de invocação • semântica at-most-once (default) • semântica OneWay métodos sem resultados ou callbacks, o cliente não bloqueia na espera de uma resposta • Semântica at-most-once O cliente continua imediatamente e pode mais tarde bloquear-se à espera da resposta Objeto CORBA: objeto remoto • implementa uma interface IDL • possui uma referência de objeto remoto • capaz de responder a invocações aos métodos de sua interface client client proxy program for A implementation repository ORB core or dynamic invocation Request Reply server interface repository object skeleton adapter ORB core or dynamic skeleton Servant A Adaptador de objeto (Object Adapter) • interliga os objetos CORBA e as classes do • • • • servidor cria as referências a objetos remotos para os objetos CORBA despacha cada RMI através de um skeleton para o servidor apropriado ativa objetos (se necessário) CORBA 2.2: POA (Portable Object Adapter) permite que aplicações e servidores sejam executados em ORBs produzidos por desenvolvedores diferentes Skeleton (servidor) • geradas na linguagem do servidor por um compilador IDL • RMIs são despachadas através do skeleton apropriado a um servidor • marshaling e unmarshaling Stubs/proxies (cliente) • geradas na linguagem do cliente por um compilador IDL • proxy (linguagens orientadas a objeto) • stub (linguagens procedurais) • marshaling e unmarshaling Repositório de implementação • ativa por demanda os servidores registrados, e localiza os • • • • servidores em execução armazena tabela com o mapeamento dos nomes dos adaptadores de objetos para suas implementações na ativação de objeto remoto, o hostname e o número da porta no servidor são adicionados na tabela possibilita armazenar outras informações sobre os servidores (e.g. controle de acesso) permite replicação aumento de disponibilidade e tolerância a falhas Repositório de interface • provê informações sobre interfaces IDL registradas (e.g. métodos, argumentos, exceções) • cliente sem proxy de objeto pode obter informações necessárias (métodos e argumentos) • necessário para invocações dinâmicas • nem todos os ORBs provêm um repositório de interfaces Interface de invocação dinâmica • permite que clientes façam invocações dinâmicas a objetos CORBA desconhecidos • cliente obtém informações necessárias sobre um objeto CORBA a partir do repositório de interfaces, e utiliza esta informação para construir uma invocação e enviá-la ao servidor Passo para uma Inovação Dinâmica 1. Identificar o objeto que queremos invocar (provavelmente através do Trader Service do CORBAservices); 2. Recuperar sua interface (buscá-la no Repositório de Interfaces); 3. Construir a invocação; 4. Invocar a requisição, e receber os resultados. Interface skeleton dinâmica • permite um objeto CORBA aceitar invocações em uma interface sem skeleton interface não era conhecida em tempo de compilação • skeleton dinâmico recebe a invocação inspeciona o conteúdo da requisição para descobrir o objeto destino, o método para ser invocado e os argumentos invoca o destino Facilidades para definir módulos, interfaces, tipos, atributos e métodos sintaxe similar a C++ incluindo mais algumas palavraschaves Módulos IDL • permite agrupar interfaces e outros tipos IDL em unidades lógicas • módulo define um nome de escopo (evita conflito entre nomes) Interfaces IDL • descrevem os métodos e atributos que são disponíveis por objetos CORBA que implementam a interface module HelloApp { interface Hello { string sayHello(); oneway void shutdown(); }; }; class HelloImpl extends HelloPOA { private ORB orb; public void setORB(ORB orb_val) { orb = orb_val; } // implementação do método sayHello() public String sayHello() { return "\nHello world !!\n"; } // implementação do método shutdown() public void shutdown() { orb.shutdown(false); } } public class HelloServer { public static void main(String args[]) { try{ // Criação e inicialização do ORB ORB orb = ORB.init(args, null); // obtém a referência do rootpoa e ativa o POAManager POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); // cria o servant e registra com o ORB HelloImpl helloImpl = new HelloImpl(); helloImpl.setORB(orb); // obtém referência do objeto servant org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); // Especifica o servidor de nomes(INS) NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // Especifica uma referência de objeto String name = "Hello"; NameComponent path[] = ncRef.to_name( name ); ncRef.rebind(path, href); System.out.println("HelloServer ready and waiting ..."); // Aguarda a invocação de clientes orb.run(); } catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); }System.out.println("HelloServer Exiting ...");}} public class HelloClient { static Hello helloImpl; public static void main(String args[]) { try{ // Cria e inicializa o ORB ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); String name = "Hello"; helloImpl = HelloHelper.narrow(ncRef.resolve_str(name)); System.out.println("Obtained a handle on server object: " + helloImpl); System.out.println(helloImpl.sayHello()); helloImpl.shutdown(); } catch (Exception e) { System.out.println("ERROR : " + e) ; e.printStackTrace(System.out); } } } } idlj -fall -Hello.idl ●Javac *.java ● orbd -ORBInitialPort 1050 -ORBInitialHost localhost & ● java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost& ● java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost ● Transparência de localização • Tratamento igual para Função local Deficiências de projeto e processo Problemas com implementações Firewalls 1) Construir um exemplos simples onde programas se comuniquem usando CORBA • Nível 1: Mesma linguagem • Nível 2: Entre Java e C++ http://openorb.sourceforge.net/ • Nível 3: Entre Java/C++ e Lua (OiL - http://oil.luaforge.net/index.html). • Com base na experiência adquirida fazer um relato do uso de CORBA com as linguagens utilizadas. • Entrega dos códigos fontes Uma linguagem de script leve • Pequena, portátil, eficiente Uma linguagem tipada dinamicamente • O tipo da variável depende do valor armazenado • Toda linguagem pode ter erro de “tipos” em tempo de execução Uma linguagem com gerência automática de memória Pré-compilação em bytecodes • Pode-se carregar arquivos compilados Sintaxe convencional print(“hello world”) print“hello world” Comentários de 1 linha -- (dois traços) Comentários de blocos --[[ bloco ]] Varáveis globais não precisam de declaração Variáveis locais são declaradas com a palavra chave local 8 tipos básicos • nil – tipo do valor nil que é diferente de qualquer outro, é o • • • • • • • valor default das variáveis boolean – true, false number – double string – array de caracteres, imutável function – valor de primeira classe, significa que funções podem ser armazenadas em variáveis, passadas como argumentos, retornadas userdata – dados C arbitrários, manipulado através da API C thread – threads independentes de execução table – arrays associativos Consulta do tipo da variável através da função type Aritméticos +, -, *, /, ^ Relacionais <, >, <=, >=, ==, ~= Operadores lógicos and, or, not Avaliação por curto-circuito Concatenação .. a =0 a, b, c = 0, 0, 0 a, b = b, a -- troca de valores a, b, c = 0, 0 -- c recebe nil Resultado da expressão {} Qualquer valor como chave, exceto nil Único mecanismo de estruturação de dados Indexação na forma variável[índice] ou variável.índice, quando o índice é uma string for var = inicio, fim [, passo] do bloco end Numérico for var {, var} in expressão do bloco end Genérico while expressão do bloco end repeat block until expressão break ou return pode ser usado para terminar o laço if expressão then bloco {elseif expressão then bloco} [else bloco] end Retorno • foo() Nenhum valor de retorno • x = foo() Ajustado para 1 valor • x, y = foo() Ajustado para 2 valores • {foo()} Cria uma tabela com todos os valores retornados Basic String Table Math IO OS Oferecem funções básicas • print • type • setmetatable • pairs • error Funções para manipulação de strings Funções para manipulação de tabelas • table.insert • table.remove • table.sort Funções matemáticas • math.sqrt • math.sin • math.log Funções • io.open • io.close • io.read • io.write de entrada e saída Funções associadas ao sistema operacional • os.clock • os.date • os.execute Manual Wiki Lua-Users Lista de Discussão IRC http://www.corba.hpg.com.br/home2.ht ml http://www.das.ufsc.br/~montez/corba/c orba.html http://java.sun.com/j2se/1.4.2/docs/gui de/idl/orbd.html