Uma Introdução à Arquitetura CORBA Francisco C. R. Reverbel IME-USP Departamento de Ciência da Computação 1 Copyright © 1998-2006 Francisco Reverbel O Object Request Broker (ORB) Via de comunicação entre objetos (object bus), na arquitetura do OMG Definido pela especificação CORBA (Common Object Request Broker Architecture) – 1991: CORBA 1.0 – 1995: CORBA 2.0 (IIOP) – 1997: CORBA 2.2 (Portable Object Adapter) – 1998: CORBA 2.3 (Objects by Value) – 2002: CORBA 3.0 IME-USP Departamento de Ciência da Computação 2 Copyright © 1998-2006 Francisco Reverbel Arquitetura de Gerenciamento de Objetos OMA (Object Management Arquitecture): Application Interfaces Domain Domain Domain Domain Interfaces Interfaces Interfaces Interfaces Object Request Broker (ORB) Object Services IME-USP Departamento de Ciência da Computação 3 Copyright © 1998-2006 Francisco Reverbel Utilização da OMA Arcabouço (framework) para aplicações distribuídas: AI DI DI OS AI DI OS ORB AI OS Object Framework AI = Application Interfaces IME-USP Departamento de Ciência da Computação DI = Domain Interfaces OS = Object Services 4 Copyright © 1998-2006 Francisco Reverbel CORBA Arquitetura cliente/servidor orientada a objetos Serviço fundamental do ORB: invocação remota de métodos Clientes podem chamar métodos de objetos remotos do mesmo modo que chamam métodos de objetos locais (transparência de localização) Para chamar métodos de um objeto o cliente precisa ter uma referência para o objeto IME-USP Departamento de Ciência da Computação 5 Copyright © 1998-2006 Francisco Reverbel Transparência de Localização Máquina X Cliente Objrefs Máquina Y Servidor remoto Objeto CORBA objeto co-locado Objeto CORBA Servidor local Objeto CORBA Objeto CORBA Objeto CORBA Objeto CORBA Objeto CORBA IME-USP Departamento de Ciência da Computação 6 Copyright © 1998-2006 Francisco Reverbel Invocação Remota de Métodos O cliente simplesmente chama um método sobre uma object reference – O ORB se encarrega de mandar uma mensagem de requisição, esperar a mensagem de resposta e retornar os resultados para o cliente – Para o cliente parece uma chamada de método normal Independência de linguagens de programação, sistemas operacionais e plataformas de hardware IME-USP Departamento de Ciência da Computação 7 Copyright © 1998-2006 Francisco Reverbel Invocação Remota de Métodos (cont.) O que parece acontecer Máquina X Máquina Y Cliente Servidor chama objref IME-USP Departamento de Ciência da Computação 8 Objeto CORBA Copyright © 1998-2006 Francisco Reverbel Invocação Remota de Métodos (cont.) O que parece acontecer Máquina X Máquina Y Cliente Servidor chama objref O que acontece na verdade Máquina X Máquina Y envia requisição Cliente chama objref Objeto CORBA Servidor Objeto CORBA Stub recebe resposta IME-USP Departamento de Ciência da Computação 9 Copyright © 1998-2006 Francisco Reverbel Serventes Objetos CORBA são encarnados por entidades da linguagem de programação na qual o servidor foi escrito Essas entidades são denominadas serventes – Ao longo de sua vida um objeto CORBA pode ser representado por diferentes serventes Em C++ ou Java um servente é uma instância de uma classe IME-USP Departamento de Ciência da Computação 10 Copyright © 1998-2006 Francisco Reverbel Refinando uma Figura Já Vista O que parece acontecer Máquina X Cliente chama Objeto CORBA objref IME-USP Departamento de Ciência da Computação 11 Copyright © 1998-2006 Francisco Reverbel Refinando uma Figura Já Vista O que parece acontecer Máquina X Cliente chama O que acontece na verdade Máquina X Cliente chama objref Objeto CORBA objref Máquina Y envia requisição Stub Servidor Esqueleto chama Servente recebe resposta IME-USP Departamento de Ciência da Computação 12 Copyright © 1998-2006 Francisco Reverbel Stubs e Esqueletos O usuário não precisa escrever: – nem os stubs usado nos clientes – nem o esqueletos usados no servidores. O que faz o esqueleto: – Desempacota os parâmetros recebidos numa mensagem de requisição – Chama o método de um servente que implementa a operação requisitada – Empacota numa mensagem de resposta os resultados da operação IME-USP Departamento de Ciência da Computação 13 Copyright © 1998-2006 Francisco Reverbel O Compilador IDL Os stubs e esqueletos são automaticamente gerados por um compilador IDL O compilador IDL recebe como entrada uma especificação das interfaces dos objetos Essa especificação é escrita numa linguagem neutra, a Interface Definition Language (IDL) – Independência de linguagem de programação IME-USP Departamento de Ciência da Computação 14 Copyright © 1998-2006 Francisco Reverbel Componentes de CORBA Cliente Interface de Invocação Dinâmica Stub IDL Servidor Esqueleto IDL Interface do ORB Esqueleto Dinâmico Adaptador de Objetos Núcleo do ORB Independe de ORB Depende do adaptador Depende das definições IDL Interface proprietária IME-USP Departamento de Ciência da Computação 15 Copyright © 1998-2006 Francisco Reverbel Partes da Especificação CORBA O núcleo (core) do ORB A linguagem de definição de interfaces (IDL) O repositório de interfaces Mapeamentos de IDL para linguagens de programação Stubs e esqueletos estáticos Interfaces de invocação dinâmica (DII) e de esqueleto dinâmico (DSI) Adaptadores de objetos (Object Adapters) O repositório de implementações Protocolos (GIOP e IIOP) IME-USP Departamento de Ciência da Computação 16 Copyright © 1998-2006 Francisco Reverbel O Desenvolvimento de um Sistema Etapas Gerais: – Defina as interfaces dos objetos e expresse-as em OMG IDL (Interface Definition Language) – Gere stubs e esqueletos – Implemente objetos serventes – Implemente o programa servidor – Implemente aplicações clientes IME-USP Departamento de Ciência da Computação 17 Copyright © 1998-2006 Francisco Reverbel OMG IDL Linguagem declarativa usada para especificar interfaces de objetos – Sintaxe baseada em C++ – Suporta herança de interfaces – Todas as interfaces de objetos são derivadas de CORBA::Object – CORBA é especificada em IDL ❏ de modo a ser independente de linguagem de programação – Oferece tipos básicos (pré-definidos) e permite definição de tipos pelos usuários IME-USP Departamento de Ciência da Computação 18 Copyright © 1998-2006 Francisco Reverbel Mapeamentos de IDL Definem como IDL é traduzida para as diferentes linguagens de programação O OMG padronizou mapeamentos de IDL para C, C++, Smalltalk, Java, COBOL, Ada, Lisp, PL/1 e Python – Há mapeamentos para outras linguagens, mas ainda são proprietários (não padronizados) IME-USP Departamento de Ciência da Computação 19 Copyright © 1998-2006 Francisco Reverbel Exemplo de Interface IDL // IDL module Stock { exception UnknownStock { string name; }; interface Quoter { string name(); long value(in string stock) raises(UnknownStock); }; }; IME-USP Departamento de Ciência da Computação 20 Copyright © 1998-2006 Francisco Reverbel Geração de Stubs e Esqueletos definições IDL repositório de interfaces compilador IDL stubs esqueleto cliente servidor IME-USP Departamento de Ciência da Computação 21 Copyright © 1998-2006 Francisco Reverbel Servente Java para a Interface Quoter import java.util.Hashtable; public class QuoterImpl extends Stock.QuoterPOA { QuoterImpl(String name) {...} public String name() { return myName; } public int value(String stock) throws Stock.UnknownStock {...} private String myName; private Hashtable myTable; } IME-USP Departamento de Ciência da Computação 22 Copyright © 1998-2006 Francisco Reverbel Implementação da Operação value() public int value(String stock) throws Stock.UnknownStock { Integer result = (Integer)myTable.get(stock); if (result == null) { throw new Stock.UnknownStock(stock); } return result.intValue(); } IME-USP Departamento de Ciência da Computação 23 Copyright © 1998-2006 Francisco Reverbel Construtor da Classe QuoterImpl QuoterImpl(String name) { myName = name; myTable = new Hashtable(); // inicializa myTable com informações // lidas de um arquivo ou banco de dados // ... // // (num quoter real, myTable deveria ser atualizado periodicamente) } IME-USP Departamento de Ciência da Computação 24 Copyright © 1998-2006 Francisco Reverbel Mainline do Servidor de Cotações public static void main(String[] args) throws Exception { org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); org.omg.CORBA.Object obj = orb.resolve_initial_references("RootPOA"); POA poa = POAHelper.narrow(obj); QuoterImpl quoterServant = new QuoterImpl("Reuters"); IME-USP Departamento de Ciência da Computação 25 Copyright © 1998-2006 Francisco Reverbel Mainline do Servidor de Cotações org.omg.CORBA.Object quoter = quoterServant._this_object(orb); PrintWriter iorFile = new PrintWriter( new FileWriter("quoter.ref") ); iorFile.println(orb.object_to_string(quoter)); iorFile.close(); poa.the_POAManager().activate(); orb.run(); } IME-USP Departamento de Ciência da Computação 26 Copyright © 1998-2006 Francisco Reverbel Obtenção de Object References Clientes precisam obter object references Uma object reference é obtida como resultado de alguma operação chamada pelo cliente – Clientes não podem “construir” ou “inventar” object references Uma object reference pode ser convertida em string e depois reconvertida em object reference – Você pode guardar essa string num arquivo – Pode divulgá-la como bem entender IME-USP Departamento de Ciência da Computação 27 Copyright © 1998-2006 Francisco Reverbel Exemplo de Cliente Java public static void main(String[] args) { try { BufferedReader iorFile = new BufferedReader( new FileReader("quoter.ref") ); String s = iorFile.readLine(); iorFile.close(); org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); IME-USP Departamento de Ciência da Computação 28 Copyright © 1998-2006 Francisco Reverbel Exemplo de Cliente Java (cont.) org.omg.CORBA.Object obj = orb.string_to_object(s); Quoter quoter = QuoterHelper.narrow(obj); System.out.println( "Valor de " + args[0] + ": " + quoter.value(args[0]) + " (fonte: " + quoter.name() + ")” ); } IME-USP Departamento de Ciência da Computação 29 Copyright © 1998-2006 Francisco Reverbel Exemplo de Cliente Java (cont.) catch (Stock.UnknownStock e) { System.out.println( "Nao disponível cotação de " + args[0] ); } catch (Exception e) { e.printStackTrace(); } } IME-USP Departamento de Ciência da Computação 30 Copyright © 1998-2006 Francisco Reverbel Observações No exemplo visto o servidor e o cliente foram escritos na mesma linguagem Poderiam ter sido escritos em linguagens diferentes – Por exemplo: servidor em C++ e cliente em Java CORBA provê interoperabilidade entre – linguagens de programação – sistemas operacionais – arquiteturas de hardware IME-USP Departamento de Ciência da Computação 31 Copyright © 1998-2006 Francisco Reverbel