03 - serviços de localização JNDI

Embed Size (px)

Citation preview

Java 2 Enterprise Edition

Servios de LocalizaoHelder da Rochawww.argonavis.com.br

1

ObjetivosEste mdulo descreve os servios bsicos para localizao de recursos em J2EELocalizao de componentes (servlets, EJBs) Localizao de fontes de dados (bancos, filas, pilhas) Objetos compartilhados

Recursos so localizados atravs da interface JNDI Java Naming and Directory InterfaceEste mdulo descreve o uso bsico de JNDI Para maiores detalhes e sobre o uso de JNDI independente de um servidor de aplicaes, consulte slides do minicurso J523, que explora outros detalhes de JNDI Alguns exerccios foram adaptados do JNDI Tutorial da Sun2

Servio de nomesA principal funo de um servio de nomes permitir a associao de um nome (ou uma outra representao alternativa mais simples) a recursos computacionais como endereos de memria, de rede, de servios objetos e referncias cdigos em geral Suas duas funes bsicas so Associar (mapear) um nome a um recurso Localizar um recurso a partir de seu nome Exemplos Sistema de arquivos: liga caminho a bloco(s) de memria:c:\temp\dados.txt 16A0:0C00

Sistema DNS: liga nome de domnio a endereo IP:www.argonavis.com.br 200.206.192.193

3

Contextos e Sistemas de NomesUm contexto um conjunto de ligaes nome-objetoEm outras palavras, um objeto que tem zero ou mais ligaes

Se o objeto (referncia) contido no contexto for tambm um contexto ele um subcontextoO escopo do subcontexto limitado pelo seu contexto pai

Exemplos de contextos e subcontextos:/usr/bin/java/ usr o contexto; bin subcontexto de usr, ... www.abc.com.br br o contexto, com subcontexto de br, ...

Um sistema de nomes um conjunto interligado de contextos que respeitam a mesma conveno e possuem um conjunto comum de operaes4

Diretrios e Servios de DiretrioDiretrio: conjunto interligado de objetosOrganizao no precisa ser hierrquica (contextual) Para cada item h um nome unvoco (chave) Cada item possui um ou mais atributos

Um servio de diretrio oferece operaes para criar, remover, modificar e principalmente pesquisar atributos associados a objetos em um diretrio Um atributo possuiUm identificador Conjunto de valores Um tipo: restringe os dados que um atributo pode receber

Sistemas de nomes so frequentemente estendidos com servios de diretrio5

JNDIJava Naming and Directory Interface uma ponte sobre os diversos servios de nomes e diretrios diferentes VantagensS preciso aprender uma nica API para acessar vrios tipos de informao de servios de diretrio Isola a aplicao dos detalhes especficos do protocolo Pode ser usada para ler objetos Java (serializados) que estejam armazenados em um diretrio Pode combinar diferentes tipos de diretrio (federao) e trat-los como um diretrio nico

Componentes

API - Application Programming Interface SPI - Service Provider Interface que permite que novos servios sejam plugados transparentemente 6

Arquitetura JNDIAplicao Java JNDI API Naming ManagerJNDI Service Provider Interface (SPI)NDS SP FileSystem SP LDAP SP DNS SP RMI SP Corba SP WinReg SP Service Providers Sistemas de Nomes e Diretrios Pacote javax.naming

NDS

Sistema de Arquivos

LDAP

DNS

RMI Registry

COS Naming

Windows Registry

Fonte: JNDI Tutorial

7

JNDI APIA API JNDI est includa no J2SDK 1.3 ou posterior nos pacotes e subpacotes descendentes de javax.naming. Para usar JNDI preciso terAs classes e interfaces do JNDI (pacotes javax.naming.*) Pelo menos um provedor de servios JNDI (driver)

O Java 2 SDK inclui provedores de servio (SPs) paraLDAP - Lightweight Directory Access Protocol CORBA - Common ORB Architecture e COS name service Java RMI Registry

Outros provedores de servios (para sistema de arquivos, para DNS, para JDBC, para Windows Registry, etc.) podem ser encontrados a partir do sitehttp://java.sun.com/products/jndi/serviceproviders.html

8

Principais classesA API JNDI consiste de cinco pacotes O principal pacote javax.naming que contm as principais classes e interfacesContext: interface onde se pode recuperar, ligar, desligar e renomear objetos, e criar e destruir contextos InitialContext: ponto de partida (raiz) para todas as operaes Name: abstrao de um nome. Contm geralmente um String de texto que corresponde ao nome do objeto ou contexto NameClassPair: contm nome do objeto e de sua classe Binding: contm nome do objeto ligado, nome da classe do objeto e o prprio objeto Reference: abstrao de uma referncia para um objeto NamingEnumeration: um tipo de java.util.Enumeration usado para colecionar componentes de um contexto NamingException: principal exceo do JNDI 9

Contexto inicialPrecisa ser obtido antes de qualquer operao. Passos: 1: selecionar o provedor de serviosProperties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, "classe.do.ProvedorDeServicos");

2: configurar o acesso ao servioenv.put(Context.PROVIDER_URL, "ldap://xyz.com:389"); env.put(Context.OUTRA_PROPRIEDADE, "valor"); (...)

3: criar um objeto para representar o contextoContext ctx = new InitialContext(env);

A configurao (1, 2) pode ser feita via propriedades do sistemaPassadas em linha de comando via argumento -Dprop=valor Carregados via arquivos de propriedades

Principais propriedadesjava.naming.factory.initial: java.naming.provider.url: Context.INITIAL_CONTEXT_FACTORY Context.PROVIDER_URL

10

Arquivo jndi.propertiesUma outra forma de definir propriedades usadas pelos clientes JNDI, atravs de um arquivo jndi.propertiesUm arquivo com este nome deve ser colocado no CLASSPATH da aplicao cliente Ao inicializar o ambiente com InitialContext(), no passe nenhum parmetro no construtor. O class loader ir procurar um arquivo jndi.properties no CLASSPATH e carregar as propriedades que estiverem definidas dentro dele

Por exemplo, um arquivo pode conterjava.naming.factory.initial=\ com.sun.jndi.fscontext.RefFSContextFactory java.naming.provider.url=file:/cap02/lab/filesys

Para inicializar o sistema com essas propriedades, useContext ctx = new InitialContext();

11

Recuperao de objetos (lookup)Para obter a referncia para um objeto de um contexto usa-se o mtodo lookup()Para usar o objeto retornado preciso conhecer o seu tipo e fazer o cast (ou narrow, se objeto remoto) para promover a referncia Se o objeto for um contexto, lookup() age como um mtodo para mudar de contexto (como o chdir, em Unix)

Exemplo

O mtodo lookup() usando com o provedor de servio fscontext retorna um java.io.File pelo nome de arquivo Servio de nomes parasistema de arquivos env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");

env.put(Context.PROVIDER_URL,"file:/cap02/lab/filesys"); Context ctx = new InitialContext(env);

Diretrio raiz do servio Arquivo localizado na raiz do servio

File f = (File)ctx.lookup("report.txt");

12

Listagem do contedo de contextosEm vez de obter um objeto de cada vez via lookup(), pode-se obter uma lista delesMtodo list() retorna uma lista (NamingEnumeration) de pares nome / nome_da_classe (objetos do tipo NameClassPair)NamingEnumeration lista = ctx.list("awt"); while (lista.hasMore()) { NameClassPair nc = (NameClassPair)lista.next(); System.out.println(nc); } Trecho de List.java

Mtodo listBindings() retorna uma lista de ligaes nome / objeto (Binding)NamingEnumeration lista = ctx.listBindings("awt"); while (lista.hasMore()) { Binding bd = (Binding)lista.next(); System.out.println(bd.getName() + ": " + bd.getObject()); } Trecho de ListBindings.java

13

Modificao de ligaes, objetos e contextosAdicionando ligaesFruit fruit = new Fruit("orange"); ctx.bind("favorite", fruit);Bind.java

Substituindo ligaesFruit fruit = new Fruit("lemon"); ctx.rebind("favorite", fruit);Rebind.java Unbind.java Rename.java Create.java Destroy.java

Removendo ligaesctx.unbind("favorite");

Renomeando objetosctx.rename("report.txt", "old_report.txt");

Criando novos contextosContext result = ctx.createSubcontext("new");

Destruindo contextosctx.destroySubcontext("new"); Rode List ou ListBindings aps cada operao para ver os resultados

14

Provedores de servios para objetosPode-se usar JNDI para mapear nomes a objetosObjetos localizveis por nome podem ser abstrados do contexto ou at linguagem em que so usados Aplicaes diferentes podem compartilhar objetos

Dois drivers JNDI esto disponveis para acesso a objetos distribudos no J2SDKSPI CORBA (COS Naming): permite localizao de objetos CORBA (serializados em um formato independende de linguagem) - usado em RMI-IIOP (EJB)com.sun.jndi.cosnaming.CNCtxFactory

SPI RMI: permite a localizao de objetos Java serializados (objetos pode ser usados por outras aplicaes Java)com.sun.jndi.rmi.registry.RegistryContextFactory

15

Objetos RMIProprieades a definirjava.naming.factory.initial ou Context.INITIAL_CONTEXT_FACTORY com.sun.jndi.rmi.registry.RegistryContextFactory java.naming.provider.url ou Context.PROVIDER_URL rmi://nome_do_host:1099 (endereo e porta do RMI Registry)

MapeamentoContext ctx = new InitialContext(); Fruit fruit = new Fruit("orange"); ctx.bind("favorite", fruit);

LocalizaoContext ctx = new InitialContext(); Fruit fruit = (Fruit) ctx.lookup("favorite");

16

Objetos CORBA (RMI sobre IIOP)Proprieades a definirjava.naming.factory.initial ou Context.INITIAL_CONTEXT_FACTORY com.sun.jndi.cosnaming.CNCtxFactory java.naming.provider.url ou Context.PROVIDER_URL iiop://nome_do_host:1900 (endereo e porta do ORB)

MapeamentoContext ctx = new InitialContext(); Fruit fruit = new Fruit("orange"); ctx.bind("favorite", fruit); Converte objeto CORBA em objeto Java

Localizao

Context ctx = new InitialContext(); Object corbaFruit = ctx.lookup("favorite"); Object javaFruit = javax.rmi.PortableRemoteObject.narrow(corbaFruit, Fruit.class); Fruit fruit = (Fruit)javaFruit;

17

Servio JNDI no JBossPode-se usar bind() e lookup() para armazenar e localizar objetos no servidor JNDI do JBossComponentes Web e EJB so mapeados (bound) automaticamente, durante a implantao (o servidor usa informaes no web.xml, ejb-jar.xml e outros arquivos de configurao existentes)

Para verificar os mapeamentos JNDI existentes, acesse o servio JNDIView em http://localhost:8080/jmx-console

18

Fontes de dadosNo JBoss, pools de conexes de bancos de dados so acessveis no servidor atravs de objetos DataSource, publicadas no JNDI abaixo no namespace java:/java:/CloudscapeDB java:/OracleDB

Os nomes so configurados nos arquivos *-ds.xml do JBoss (localizados em deploy) Para acessar um banco existente no servidor use JNDI e nome definido no *-service.xml correspondenteContext ctx = new InitialContext(); javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("java:/DefaultDS"); java.sql.Connection = ds.getConnection();

19

Banco HSQLDBO JBoss traz embutido o banco de dados HSQLDB (ex-HyperSonic) Para acessar o banco atravs de JNDI, usejava:/DefaultDS

DefaultDS um nome genrico para designar a fonte de dados default do servidorPode ser configurada para apontar para outro banco Pode haver outras fontes de dados criadas para o mesmo banco ou bancos diferentes no servidor

Para consultar ou alterar usuario, senha, driver ou outras configuraes de acesso ao HSQLDB, utilize o arquivo hsqldb-ds.xml, localizado em deploy.20

Configurao Default do HSQLDBJNDI Name:DefaultDS

JDBC URL:jdbc:hsqldb:hsql://localhost:1701

Driver:$JBOSS_HOME/server/default/lib/hsqldb.jar

Driver class:org.hsqldb.jdbcDriver

Arquivo de configurao JCA:$JBOSS_HOME/server/default/deploy/hsqldb-ds.xml

Nvel de isolamento suportado para transaes:TRANSACTION_READ_UNCOMMITTED

User-name:sa

Min-pool-size:5

Password:(nada)

Security domain:HsqlDbRealm

21

Enterprise Naming ContextCada EJB e cada aplicao Web tem um namespace prprio para compartilhar objetos usando JNDIjava:comp/env

chamado de Enterprise Naming Context (ENC) mapeado ao JNDI global durante a implantao: permite que componentes de uma mesma aplicao firmem ligaes lgicas entre si sem depender de recursos externos Nomes do ENC so mapeados a nomes JNDI reais pelo deployer Acesso java:comp/env no compartilhado: cada bean ou contexto Web tem o seu: preciso declarar nomes usados em cada bean!

Forma recomendada de comunicao em J2EEComponentes Web e EJBs devem obter referncias uns para os outros atravs de java:comp/envObjeto obj = (Objeto)ctx.lookup("java:comp/env/meuObjeto");

22

Exerccios1. Publicao de objetos referenciveis em JNDIa) Crie a seguinte hierarquia de contextos e objetos (Fruit) usando as classes fornecidas e o driver JNDI do JBoss (para criar um objeto, use new normalmente)frutas vermelhas morango cereja banana limo citricas laranja

b) Localize a estrutura criada atravs do servio JNDIView

2. Enterprise Naming Context (java:comp/env)a) Analise o cdigo do exemplo mostrado no primeiro captulo e localize as chamadas java:comp/env em index.jsp, referncias a EJBs no web.xml e mapeamentos com nomes globais em jboss.xml b) Ache os nomes e mapeamentos no JNDIView 23

Fontes para este captulo[1] Rossana

Lee. The JNDI Tutorial, Sun Microsystems, 2002 http://java.sun.com/products/jndi/tutorial/Parte deste captulo baseada nas primeiras duas sees (trilhas) do JNDI Tutorial.

[2]

Ed Roman et al. Mastering EJB 2.0, Wiley, 2001 http://www.theserverside.com/books/masteringEJB/index.jspApndice A tem um breve e objetivo tutorial sobre JNDI

24

[email protected]

argonavis.com.brJ500 - Aplicaes Distribudas com J2EE e JBoss Reviso 1.5 (junho de 2003) J530 - Enterprise JavaBeans Reviso 2.0 (junho de 2003)Introduo a J2EE, 2000, 2001, 2002, 2003 Atualizado em Junho de 2003

25