Versão 3 – fevereiro/2014 Tecgraf PUC-Rio Fevereiro de 2014 Desenvolvendo uma aplicação CORBA utilizando Java.

Slides:



Advertisements
Apresentações semelhantes
|Introdução a Java para programadores Telis. Jogo de Dados simples O jogo é jogado por dois jogadores. Cada jogador faz sua jogada (lança um dado), e.
Advertisements

Programação orientada a objetos
Reflexão Marco Antonio Arquiteto de Software Novembro/2007.
Tratamento de Exceções
Programa de Pós-Graduação Lato Sensu MBA em Gestão de Software
RMI-IIOP.
Persistência de objetos em arquivo texto usando Java
Invocação de Métodos Remotos RMI
1 Arquitetura CORBA Repositório de Implementação Repositório de Interface cliente programa cliente proxy ORB Core ou invocação dinâmica servidor ORB Core.
Comunicação Entre Objetos Distribuídos
Wagner Santos C. de Jesus
PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001
Estrutura de Dados em Java
Paradigmas de Linguagens de Programação Paradima da Programação Orientada à Objetos Professor: Armando Hage Belém-2008.
Objetos Distribuídos para WEB Prof. Paulo Fernando da Silva FURB – Universidade Regional de Blumenau Pós-Graduação em Desenvolvimento WEB.
CRIANDO OBJETOS EM JAVA
JAVA: Conceitos Iniciais
Concorrência em Java Threads em Java.
Programação Orientada a Objetos com Java
Tecgraf PUC-Rio setembro de 2013 Desenvolvendo uma aplicação CORBA utilizando Java.
Arquitetura CORBA e Objetos Distribuídos
Programação I Aula 2 (Métodos)
Chamada Remota de Procedimentos
Desenvolvimento de Aplicações CORBA
Concorrência e Java RMI
T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI.
Pilhas Profa. Nádia Félix.
Tecgraf PUC-Rio maio de 2011 Principais conceitos de CORBA.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Concorrência e thread Petrônio Júnior(pglj) Márcio Neves(mmn2)
Linguagem II Exceções.
Tratamento de Exceções
RMI - JAVA.
Java Kickstart, day 2 Semelhanças com linguagem C.
Aula Prática 4 Monitoria IP/CC (~if669).
Coleções, Genéricos, Threads Marco Antonio. Collection Principais métodos da interface Collection.
1 Marcio de Carvalho Victorino JAVA. 2 Declaração de Atributos [ ] [transient] [volatile] [static] [final] ; controle de acesso –public, package (default),
Objetos Distribuídos para WEB Prof. Paulo Fernando da Silva FURB – Universidade Regional de Blumenau Pós-Graduação em Desenvolvimento WEB.
Certificação Marco Antonio. Introdução A compreensão desse capítulo é muito importante pois trata de um assunto essencial em qualquer linguagem de programação,
GESTOR: TIC/TIC-E&P/GIDSEP versão 1 - julho/2013 Tecgraf PUC-Rio Fevereiro de 2014 IDL.
Tecgraf PUC-Rio maio de 2011 SDK Openbus - Java. A API do Openbus Para facilitar o desenvolvimento das aplicações que usam o barramento, provendo ou consumindo.
RMI Objetos Distribuídos Luiz C. D´oleron SCJP
API Java do SCS Tecgraf PUC-Rio Setembro de 2013.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Socket em Java.
GESTOR: TIC/TIC-E&P/GIDSEP versão 1 - julho/2013 Tecgraf PUC-Rio Fevereiro de 2014 SDK Openbus - Java.
Bruno Inojosa MCP .NET Framework
Copyright 2000, Departamento de Informática, UFPE. Todos os direitos reservados sob a legislação em vigor. Orientação a Objetos e Java.
JAVA – Fila ATAI.
API Java do SCS Tecgraf PUC-Rio maio de A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente.
Sistemas Distribuídos Aula 07 – Programação Distribuída (Corba)
Tecgraf PUC-Rio maio de 2011 Mapeamento de IDL para Java.
GESTOR: TIC/TIC-E&P/GIDSEP versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Desenvolvendo uma aplicação CORBA utilizando C#
GESTOR: TIC/TIC-E&P/GIDSEP versão 1 - julho/2013 Tecgraf PUC-Rio Agosto de 2013 Mapeamento de IDL para Java.
Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Principais conceitos de CORBA.
RMI Java Remote Method Invocation em Java. Introdução Java Remote Method Invocation (Java RMI) permite desenvolver sistemas distribuídos baseados em Java.
Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 API C# do SCS.
Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#
Sistemas Distribuídos Prof. Marcus Rodrigues
Tecgraf PUC-Rio maio de 2011 Desenvolvendo uma aplicação CORBA utilizando Java.
Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 IDL.
Versão 3 – fevereiro/2014 Tecgraf PUC-Rio Fevereiro de 2014 API Java do SCS.
SOCKET - É um canal de comunicação entre processos que estabelece uma conexão entre eles na forma de cliente-servidor. Por meio de sockets, os computadores.
Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
ProgramaçãoConcorrente Glêdson Elias
Linguagem de Programação – Aula 04 Prof. Me. Ronnison Reges Vidal.
SDK Openbus - Java Tecgraf PUC-Rio Setembro de 2013.
Transcrição da apresentação:

Versão 3 – fevereiro/2014 Tecgraf PUC-Rio Fevereiro de 2014 Desenvolvendo uma aplicação CORBA utilizando Java

Versão 3 – fevereiro/2014 Exemplo passo-a-passo Veremos um exemplo, passo-a-passo, de desenvolvimento de aplicações CORBA usando Java Para desenvolver a aplicação, usaremos o Jacorb como ORB tanto para o cliente quanto para o servidor, já que ambos serão desenvolvidos em Java

Versão 3 – fevereiro/2014 Passo 1: Jacorb e JDK A versão 3.3 do Jacorb pode ser obtida: Do pacote do exercício, no site do curso Precisaremos também do JDK 1.6 Para fazer build do exemplo, usaremos o Ant: –

Versão 3 – fevereiro/2014 Libs do Pacote do Exercício idl-3.3.jar jacorb-3.3.jar slf4j-api jar slf4j-jdk jar

Versão 3 – fevereiro/2014 Passo 2: Escrevendo a IDL // StockMarket.idl // O módulo StockMarket consiste das definições // úteis para desenvolvimento de aplicações // que lidam com mercado de ações. module StockMarket { // Exceção para definir o uso de um símbolo desconhecido exception UnknownSymbol { string symbol; }; // O tipo StockSymbol é usado para representar os // identificadores das ações typedef string StockSymbol; // Um StockSymbolList é uma sequência de StockSymbols. typedef sequence StockSymbolList; // A interface StockServer é a interface que fornece // as informações sobre as ações do mercado. interface StockServer { // getStockValue() retorna o valor de uma // determinada ação identificada por um // StockSymbol fornecido como parâmetro de entrada. // Se o StockSymbol dado for desconhecido, a exceção // UnknownSymbol deve ser lançada. float getStockValue(in StockSymbol symbol) raises (UnknownSymbol); // getStockSymbols() retorna uma sequência com todos os // StockSymbols conhecidos pelo servidor do mercado de // ações. StockSymbolList getStockSymbols(); };

Versão 3 – fevereiro/2014 Passo 3: Compilando a IDL Para compilar a IDL, usaremos o Ant e o compilador IDL do Jacorb:

Versão 3 – fevereiro/2014 Arquivos gerados na compilação da IDL Todas as classes estão dentro do pacote StockMarket – StockServer.java – StockServerOperations.java – StockServerHelper.java – StockSymbolHelper.java – StockSymbolListHelper.java – StockServerHolder.java – StockSymbolListHolder.java – StockServerPOA.java – StockServerPOATie.java – _StockServerStub.java } Interface Files Helper Files Holder Files Stubs e Skeleton Files } } }

Versão 3 – fevereiro/2014 Interface Files A interface IDL StockServer é mapeada para: – uma interface java de assinatura StockServer.java – uma interface java de operações StockServerOperations.java A interface de assinatura possui o mesmo nome da interface IDL, estende outras interfaces CORBA e é usada como o tipo referenciado em outras interfaces. A interface de operações possui o nome da interface IDL junto com o sufixo Operations e é uma interface “java pura”, ou seja, possui apenas as declarações das operações e atributos definidos na interface IDL

Versão 3 – fevereiro/2014 StockServerOperations.java package StockMarket; /** * Generated from IDL interface "StockServer". * JacORB IDL compiler V 3.1, 19-Aug-2012 generated at Jun 24, :43:01 PM */ public interface StockServerOperations { /* constants */ /* operations */ float getStockValue(java.lang.String symbol); java.lang.String[] getStockSymbols(); }

Versão 3 – fevereiro/2014 StockServer.java package StockMarket; /** * Generated from IDL interface "StockServer". * JacORB IDL compiler V 3.1, 19-Aug-2012 generated at Jun 24, :43:01 PM */ public interface StockServer extends StockServerOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity { } org.omg.CORBA.Object: é a interface raiz para todas as referências a objetos CORBA na linguagem Java, análogo à interface java.rmi.Remote para os objetos remotos RMI org.omg.CORBA.portable.IDLEntity: interface de “marcação” cuja finalidade é apenas indicar que a classe que implementa essa interface é um tipo IDL que possui uma classe de Helper correspondente

Versão 3 – fevereiro/2014 Stub e Skeleton Files A compilação da IDL StockServer produz a classe _ StockServerStub.java que atua como stub do cliente e as classes StockServerPOA.java e StockServerPOATie.java que servem de skeleton do servidor Veremos depois que o uso das classes de skeleton POA ou POATie depende da estratégia adotada para implementação do servidor: por herança ou por delegação

Versão 3 – fevereiro/2014 _StockServerStub.java package StockMarket; /** * Generated from IDL interface "StockServer". * JacORB IDL compiler V 3.1, 19-Aug-2012 generated at Jun 24, :43:01 PM */ public class _StockServerStub extends org.omg.CORBA.portable.ObjectImpl implements StockMarket.StockServer {... public float getStockValue(java.lang.String symbol) {... } public java.lang.String[] getStockSymbols() {... }

Versão 3 – fevereiro/2014 StockServerPOA.java package StockMarket; /** * Generated from IDL interface "StockServer". * JacORB IDL compiler V 3.1, 19-Aug-2012 generated at Jun 24, :43:01 PM */ public abstract class StockServerPOA extends org.omg.PortableServer.Servant implements org.omg.CORBA.portable.InvokeHandler, StockMarket.StockServerOperations {... }

Versão 3 – fevereiro/2014 StockServerPOATie.java package StockMarket; import org.omg.PortableServer.POA; /** * Generated from IDL interface "StockServer". * JacORB IDL compiler V 3.1, 19-Aug-2012 generated at Jun 24, :43:01 PM */ public class StockServerPOATie extends StockServerPOA {... private StockServerOperations _delegate; public StockServerPOATie(StockServerOperations delegate) { _delegate = delegate; } public float getStockValue(java.lang.String symbol) { return _delegate.getStockValue(symbol); } public java.lang.String[] getStockSymbols() { return _delegate.getStockSymbols(); }

Versão 3 – fevereiro/2014 Helper Files A compilação da IDL StockServer produz as classes de Helper StockServerHelper.java, StockSymbolHelper.java e StockSymbolListHelper.java As classes de Helper oferecem diversos métodos estáticos úteis na manipulação do tipo correspondente: – inserir e extrair um objeto do tipo em Any – obter o repository id – ler de um stream e escrever para um stream – …

Versão 3 – fevereiro/2014 Helper Files A classe de Helper gerada a partir de uma interface IDL, também inclui operações de narrow para converter o tipo genérico org.omg.CORBA.Object para o tipo específico. A exceção IDL CORBA::BAD_PARAM é lançada se a conversão do narrow falhar devido a inconsitência do tipo da referência do objeto.

Versão 3 – fevereiro/2014 StockSymbolHelper.java package StockMarket; /* * Generated from IDL alias "StockSymbol". * JacORB IDL compiler V 3.1, 19-Aug-2012 generated at Jun 24, :43:01 PM */ public final class StockSymbolHelper {... public static void insert (org.omg.CORBA.Any any, java.lang.String s) {... } public static java.lang.String extract (final org.omg.CORBA.Any any) {... } public static String id() { return "IDL:StockMarket/StockSymbol:1.0"; } public static java.lang.String read ( final org.omg.CORBA.portable.InputStream _in) {... } public static void write ( final org.omg.CORBA.portable.OutputStream _out, java.lang.String _s) {... }

Versão 3 – fevereiro/2014 StockServerHelper.java package StockMarket; /** * Generated from IDL interface "StockServer". * JacORB IDL compiler V 3.1, 19-Aug-2012 generated at Jun 24, :43:01 PM */ public final class StockServerHelper { // Todos os métodos estáticos insert, extract, type, id, read e write // e mais os métodos de conversão narrow... public static StockMarket.StockServer narrow(final org.omg.CORBA.Object obj) {... } public static StockMarket.StockServer unchecked_narrow( final org.omg.CORBA.Object obj) {... } }

Versão 3 – fevereiro/2014 Holder Files Os métodos definidos nas interfaces IDL que tem passagem de parâmetros nos modos out e inout, requerem o uso de classes de Holder. – Todos os tipos primitivos da IDL possuem as classes de Holder disponíveis no pacote org.omg.CORBA package – O compilador IDL gera as classes de Holder para todos os tipos definidos pelo desenvolvedor A compilação da IDL StockServer produz as classes de Holder StockServerHolder.java e StockSymbolListHolder.java

Versão 3 – fevereiro/2014 StockSymbolListHolder.java package StockMarket; /** * Generated from IDL alias "StockSymbolList". * JacORB IDL compiler V 3.1, 19-Aug-2012 generated at Jun 24, :43:01 PM */ public final class StockSymbolListHolder implements org.omg.CORBA.portable.Streamable { public java.lang.String[] value; public StockSymbolListHolder () { } public StockSymbolListHolder (final java.lang.String[] initial) { value = initial; } public org.omg.CORBA.TypeCode _type () { return StockSymbolListHelper.type (); } public void _read (final org.omg.CORBA.portable.InputStream in) { value = StockSymbolListHelper.read (in); } public void _write (final org.omg.CORBA.portable.OutputStream out) { StockSymbolListHelper.write (out,value); }

Versão 3 – fevereiro/2014 StockServerHolder.java package StockMarket; /** * Generated from IDL interface "StockServer". * JacORB IDL compiler V 3.1, 19-Aug-2012 generated at Jun 24, :43:01 PM */ public final class StockServerHolder implements org.omg.CORBA.portable.Streamable{ public StockServer value; public StockServerHolder() { } public StockServerHolder (final StockServer initial) { value = initial; } public org.omg.CORBA.TypeCode _type() { return StockServerHelper.type(); } public void _read (final org.omg.CORBA.portable.InputStream in) { value = StockServerHelper.read (in); } public void _write (final org.omg.CORBA.portable.OutputStream _out) { StockServerHelper.write (_out,value); }

Versão 3 – fevereiro/2014 Passo 4: Compilando o código java Para compilar o código Java gerado pela IDL, usaremos o Ant e o compilador javac

Versão 3 – fevereiro/2014 Passo 5: Implementando o Servant O Servant que implementa a interface definida na IDL StockServer pode ser uma classe que estende a classe abstrata StockServerPOA ou pode ser uma classe simples cuja instância é passada para a classe de delegação StockServerPOATie Para compilar o Servant, o compilador java deve ter no classpath as classes de skeleton, as classes de interface e as classes Helper e Holder geradas pelo compilador IDL

Versão 3 – fevereiro/2014 Estratégias de implementação Em Java, CORBA suporta dois mecanismos para implementação da IDL por uma classe Servant – por herança – por delegação A diferença principal entre os dois mecanismos é que, pelo mecanismo de delegação, a classe de implementação da IDL não precisa derivar de uma classe em particular

Versão 3 – fevereiro/2014 Usando herança package StockMarket; /* * StockServerImpl implementa a interface IDL StockServer */ public class StockServerImpl extends StockServerPOA { // As ações com seus respectivos valores private Map myStock; public StockServerImpl() { myStock = new HashMap (); // Inicializa as ações com nomes e valores // fixos ou atribuídos randomicamente... } public float getStockValue(String symbol) throws UnknownSymbol { if (myStock.containsKey(symbol)) { // Simbolo encontrado; retorna seu valor return myStock.get(symbol); } else { // Simbolo não foi encontrado throw new UnknownSymbol(symbol); } public String[] getStockSymbols() { return myStock.keySet().toArray(new String[0]); }

Versão 3 – fevereiro/2014 Usando delegação package StockMarket; /** * StockServerImpl implementa a interface IDL StockServer usando * o mecanismo de delegação */ public class StockServerTieImpl implements StockServerOperations { // As ações com seus respectivos valores private Map myStock; public StockServerTieImpl () { myStock = new HashMap (); // Inicializa as ações com nomes e valores // fixos ou atribuídos randomicamente... } public float getStockValue(String symbol) throws UnknownSymbol { if (myStock.containsKey(symbol)) { // Simbolo encontrado; retorna seu valor return myStock.get(symbol); } else { // Simbolo não foi encontrado throw new UnknownSymbol(symbol); } public String[] getStockSymbols() { return myStock.keySet().toArray(new String[0]); }

Versão 3 – fevereiro/2014 Passo 6: Implementando o servidor O programa servidor se encarrega de: – inicializar o ORB – criar o objeto Servant StockServerImpl – registrar o Servant em um POA – publicar sua referência – aguardar que o cliente envie requisições Para compilar o servidor, o compilador java deve ter no classpath as classes de interface, a classe do skeleton, as classes Helper e Holder geradas pelo compilador IDL e a classe do Servant

Versão 3 – fevereiro/2014 Inicializa o ORB Properties orbProps = new Properties(); orbProps.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB"); orbProps.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton"); ORB orb = ORB.init(args, orbProps); init public static ORB init (String[] args,ORBString Properties props)Properties Creates a new ORB instance for a standalone application. This method may be called from applications only and returns a new fully functional ORB object each time it is called. Parameters: args - command-line arguments for the application's main method; may be null props - application-specific properties; may be null Returns: the newly-created ORB instance

Versão 3 – fevereiro/2014 Cria o Servant que implementa a IDL StockServerImpl stockServer = new StockServerImpl(); Se o Servant tiver adotado a estratégia de implementação por herança: Se o Servant tiver adotado a estratégia de implementação por delegação: StockServerPOATie stockServer = new StockServerPOATie(new StockServerTieImpl());

Versão 3 – fevereiro/2014 Cria o Servant que implementa a IDL Note que, até aqui, temos apenas um objeto Java instanciado Precisamos agora tornar esse objeto um objeto CORBA, capaz de receber as requisições dos clientes Usaremos, para isso, o POA, que receberá as chamadas e as redicionará ao Servant

Versão 3 – fevereiro/2014 Exporta o Servant para o POA POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); org.omg.CORBA.Object o = poa.servant_to_reference(stockServer); Obtém uma referência para uma instância do POA padrão Após fazer narrow da referência, é necessário ativar o POA (seu estado inicial é on-holding) Registra o Servant no POA

Versão 3 – fevereiro/2014 Publica a referência do objeto CORBA A interface omg.org.CORBA.ORB tem um método para obter a referência de um objeto CORBA em uma string Basta obter essa string a partir ORB, e em seguida publicá-la de alguma forma (ex: arquivo) PrintWriter ps = new PrintWriter(new FileOutputStream(new File(args[0]))); ps.println(orb.object_to_string(o)); ps.close();

Versão 3 – fevereiro/2014 Bloqueia a thread corrente para o ORB orb.run(); Bloqueia a thread corrente até o ORB ser terminado

Versão 3 – fevereiro/2014 Passo 7: Implementando o cliente O programa cliente se encarrega de: – inicializar o ORB – obter a referência para o objeto CORBA StockServer – fazer chamadas aos métodos definidos pela IDL do StockServer O módulo cliente deve ter no classpath a classe de stub _StockServerStub, a classe de assinatura StockServer e as classes Helper e Holder geradas pelo compilador IDL

Versão 3 – fevereiro/2014 Exemplo do cliente do StockServer package StockMarket; import java.io.* import org.omg.CORBA.ORB; public class StockServerClient { public static void main(String args[]) { try { // As propriedades que informam o uso do JacORB como ORB. Properties orbProps = new Properties(); orbProps.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB"); orbProps.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton"); // Inicializa o ORB. ORB orb = ORB.init(args, orbProps); // Lê o IOR do arquivo cujo nome é passado como parâmetro BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(args[0]))); String ior = reader.readLine(); // Obtém a referência para o objeto CORBA org.omg.CORBA.Object obj = orb.string_to_object(ior); StockServer server = StockServerHelper.narrow(obj); // Executa as chamadas ao objeto CORBA StockServer … } catch (…) { … }

Versão 3 – fevereiro/2014 Exemplo do cliente do StockServer public static void main(String args[]) { (…) // lê o IOR do arquivo try { org.omg.CORBA.Object obj = orb.string_to_object(ior); StockServer server = StockServerHelper.narrow(obj); System.out.println("Ações de mercado obtidas do StockServer:"); String[] stockSymbols = server.getStockSymbols(); for (int i = 0; i < stockSymbols.length; i++) { try { System.out.println(stockSymbols[i] + " " + myStock.getStockValue(stockSymbols[i])); catch (UnknownSymbol e) { System.out.println("Ação " + stockSymbols[i] + " foi removida do mercado!"); } catch (TRANSIENT e) { System.err.println("O serviço encontra-se indisponível."); } catch (COMM_FAILURE e) { System.err.println("Falha de comunicação com o serviço."); }

Versão 3 – fevereiro/2014 Passo 8: Executando o servidor java -Djava.endorsed.dirs=lib\jacorb -cp “build;lib\jacorb\jacorb-3.3.jar” StockMarket.StockServerMain ior

Versão 3 – fevereiro/2014 Saída da execução do servidor./runserver Ações do mercado criadas: UION: LGBA: ZZSP: KLVV: ZDZR: UFTH: DNKS: AQVS: AZHM: PEMR:

Versão 3 – fevereiro/2014 Passo 9: Executando o cliente java -Djava.endorsed.dirs=lib\jacorb -cp “build;lib\jacorb\jacorb-3.3.jar” StockMarket.StockServerClient ior

Versão 3 – fevereiro/2014 Saída da execução do cliente./runclient Ações de mercado obtidas do StockServer: UION LGBA ZZSP KLVV ZDZR UFTH DNKS AQVS AZHM PEMR