Académique Documents
Professionnel Documents
Culture Documents
Servios de Localizao
Helder da Rocha
www.argonavis.com.br
Objetivos
Este mdulo descreve os servios bsicos para localizao de recursos em J2EE
Localizao 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 Interface
Este 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 Sun
2
Servio de nomes
A 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
Um sistema de nomes um conjunto interligado de contextos que respeitam a mesma conveno e possuem um conjunto comum de operaes
4
Um servio de diretrio oferece operaes para criar, remover, modificar e principalmente pesquisar atributos associados a objetos em um diretrio Um atributo possui
Um identificador Conjunto de valores Um tipo: restringe os dados que um atributo pode receber
JNDI
Java Naming and Directory Interface uma ponte sobre os diversos servios de nomes e diretrios diferentes Vantagens
S 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 JNDI
Aplicao Java JNDI API Naming Manager
JNDI 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
JNDI API
A API JNDI est includa no J2SDK 1.3 ou posterior nos pacotes e subpacotes descendentes de javax.naming. Para usar JNDI preciso ter
As classes e interfaces do JNDI (pacotes javax.naming.*) Pelo menos um provedor de servios JNDI (driver)
Outros provedores de servios (para sistema de arquivos, para DNS, para JDBC, para Windows Registry, etc.) podem ser encontrados a partir do site
http://java.sun.com/products/jndi/serviceproviders.html
Principais classes
A API JNDI consiste de cinco pacotes O principal pacote javax.naming que contm as principais classes e interfaces
Context: 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 inicial
Precisa ser obtido antes de qualquer operao. Passos: 1: selecionar o provedor de servios
Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, "classe.do.ProvedorDeServicos");
Principais propriedades
java.naming.factory.initial: java.naming.provider.url: Context.INITIAL_CONTEXT_FACTORY Context.PROVIDER_URL
10
Arquivo jndi.properties
Uma outra forma de definir propriedades usadas pelos clientes JNDI, atravs de um arquivo jndi.properties
Um 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
11
Exemplo
O mtodo lookup() usando com o provedor de servio fscontext retorna um java.io.File pelo nome de arquivo Servio de nomes para
sistema 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);
File f = (File)ctx.lookup("report.txt");
12
13
Substituindo ligaes
Fruit fruit = new Fruit("lemon"); ctx.rebind("favorite", fruit);
Rebind.java Unbind.java Rename.java Create.java Destroy.java
Removendo ligaes
ctx.unbind("favorite");
Renomeando objetos
ctx.rename("report.txt", "old_report.txt");
Destruindo contextos
ctx.destroySubcontext("new"); Rode List ou ListBindings aps cada operao para ver os resultados
14
Dois drivers JNDI esto disponveis para acesso a objetos distribudos no J2SDK
SPI 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 RMI
Proprieades a definir
java.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)
Mapeamento
Context ctx = new InitialContext(); Fruit fruit = new Fruit("orange"); ctx.bind("favorite", fruit);
Localizao
Context ctx = new InitialContext(); Fruit fruit = (Fruit) ctx.lookup("favorite");
16
Mapeamento
Context 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
18
Fontes de dados
No 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 correspondente
Context ctx = new InitialContext(); javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("java:/DefaultDS"); java.sql.Connection = ds.getConnection();
19
Banco HSQLDB
O JBoss traz embutido o banco de dados HSQLDB (ex-HyperSonic) Para acessar o banco atravs de JNDI, use
java:/DefaultDS
Para consultar ou alterar usuario, senha, driver ou outras configuraes de acesso ao HSQLDB, utilize o arquivo hsqldb-ds.xml, localizado em deploy.
20
JDBC URL:
jdbc:hsqldb:hsql://localhost:1701
Driver:
$JBOSS_HOME/server/default/lib/hsqldb.jar
Driver class:
org.hsqldb.jdbcDriver
User-name:
sa
Min-pool-size:
5
Password:
(nada)
Security domain:
HsqlDbRealm
21
22
Exerccios
1. Publicao de objetos referenciveis em JNDI
a) 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
[2]
24
helder@argonavis.com.br
argonavis.com.br
J500 - 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