Informações

Tipo: Tutorial
Data de Publicação: 01/01/2004
Revisado em: 01/01/2004

Vote!

  • Currently 4,6/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags Relacionadas

j2ee jndi

Comentários ( 8 )

Imprimir

Introdução ao JNDI

por:

Gleydson Lima (gleydson@jeebrasil.com.br)

O JNDI (Java Naming and Directory Interface) é a API J2EE que fornece uma interface padrão para localizar usuários, máquinas, objetos, redes e serviços. Por exemplo, você pode utilizar o JNDI para localizar um computador na rede. Pode ser usado também para buscar objetos Java.

Introdução

O JNDI (Java Naming and Directory Interface) é a API J2EE que fornece uma interface padrão para localizar usuários, máquinas, objetos, redes e serviços. Por exemplo, você pode utilizar o JNDI para localizar um computador na rede. Pode ser usado também para buscar objetos Java.

A figura acima ilustra o cliente conectando-se a um servidor JNDI, onde existem objetos de usuários, impressoras e computadores. Os objetos de usuários poderiam, por exemplo, ter informações de senha, ultimo acesso, grupo etc. Diversos clientes na rede podem requisitar essas informações, por exemplo, as informações de autenticações de usuários poderia estar contido na árvore JNDI.

Serviço de Nomes

Os serviços de nomes são usados em várias soluções de computação. Por exemplo, quando queremos conectar com o portal do J2EEBrasil utilizamos o endereço www.j2eebrasil.com.br. Porém, na tecnologia TCP/IP só podemos abrir conexões com máquinas que conhecemos seu endereço IP. O DNS serve como um serviço de localização de endereços IP através de nomes.

Usamos também implicitamente um serviço de nomes quando estamos programando em qualquer linguagem de programação, por exemplo:

Cliente emanuel = new Cliente();

Nesta linha estamos associando uma instância da classe Cliente com o nome "emanuel".

No sistema de arquivos do computador, quando desejamos acessar um determinado arquivo, fazemos isso pelo seu nome, como /etc/passwd. Existe um serviço de nomes que mapeia nomes de arquivos a localizações no sistema de arquivos.

Quando associamos um nome a um objeto estamos realizando uma operação denominada binding. Um binding em um servidor de nomes associa o nome do site ao endereço IP, um binding de usuários associa o login ao objeto do usuário.

Quando o cliente procura por algo em um servidor de nomes ele está fazendo uma operação de lookup.

Serviço de Diretórios

Muitos serviços de nomes são estendidos com um serviço de diretórios. Um serviço de diretórios associa nomes com objetos e também permite que cada objeto tenha atributos. Dessa forma, podemos procurar objetos não apenas pelo seu nome, mas também pelos seus atributos.

Um objeto de diretório pode ser usado, por exemplo, uma pessoa, um computador, uma rede e uma impressora. Um elemento do diretório contém atributos que descrevem o objeto que ele associa.

Atributos de um computador poderiam ser processador, memória, dentre outros.

Alguns exemplos de servidores de diretórios são o Netscape Directory Server, Microsoft Active Director, iPlanet Directory Server.

Protocolos

Um dos grandes problemas dos servidores de diretórios é o protocolo de comunicação utilizado entre o cliente e o servidor para realizar as operações de lookup, binding etc. Diversas soluções de mercado possuem protocolos diferentes.

Existem serviços de diretórios que são baseados em LDAP (Lightweight Directory Access Protocol) e outros que são baseados em NIS (Network Directory System). Esses produtos possuem protocolos totalmente diferentes e incompatíveis entre si.

Nesse contexto, uma aplicação usando uma linguagem qualquer poderia usar duas APIs totalmente diferente para acessar diretórios LDAP e diretório NIS. Isso na prática é um problema de migração, pois uma mudança de servidor implica em mudança no código da aplicação.

JNDI

JNDI é uma API que permite acessar serviços de nomes e diretórios através de aplicações Java. Como muitas outras especificações em Java, é projetada para ser independente da implementação do serviço. Ou seja, os clientes acessarão diretórios LDAP e NIS através do mesmo código Java.

Ele é dividido em duas partes, a API vista pelo desenvolvedor e o SPI (Service Provider Interface) que é o que o fabricante deve implementar para fazer com que o seu produto seja um servidor compatível JNDI.

A aplicação Java acessa a API JNDI que através de um gerenciador de nomes escolhe a implementação mais apropriada e através do SPI acessa o serviço específico.

A API JNDI possui cinco pacotes, que são mostrados abaixo:

javax.naming Classes e interfaces para acessar serviços de nomes.
javax.naming.event Pacote que suporta a notificação de eventos quando acessar serviços de nomes e diretórios.
javax.naming.ldap Suporte para operações com LDAPv3
javax.naming.directory Classes e interfaces para acessar serviços de diretórios.
javax.naming.spi Define a Service Provider Interface.

Usando JNDI

Serviço de Nomes

A principal interface do serviço de nomes é a Context. Através dessa interface podemos procurar por objetos (lookup), associar e desassociar objetos a nomes, criar subcontextos, renomear objetos. A operação mais importante é a de lookup, em que se procura por um determinado nome no serviço de nomes e o objeto é retornado.

Abaixo temos um exemplo de uma operação de lookup:

Avião aviao = (Aviao) context.lookup(?Aviao?);
System.out.println(aviao.getTotalVagas());
InitialContext

Para que possamos acessar um sistema de nomes temos que construir um InitialContext - o ponto de entrada do contexto.

Para que possamos efetuar a criação de um InitialContext devemos informar alguns parâmetros, são eles:

  • Fabrica do InitialContext - Devemos informar qual a classe que fabrica objetos InitialContext. Cada implementação de servidor JNDI tem uma fábrica diferente. Por essa razão devemos informar esse parâmetro para podermos obter o ponto de entrada do contexto.
  • URL do servidor de Nomes - Localização do servidor de nomes.

Abaixo temos um exemplo de obtenção do InitialContext no JBoss 3.1.2:

  Hashtable t = new Hashtable();  

  t.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); 
  t.put(Context.PROVIDER_URL, "jnp://localhost:1099"); 

  Context ic = new InitialContext(t);

JNDI e o J2EE

O serviço de nomes é muito importante no J2EE. Para que possamos localizar objetos distribuídos precisamos buscar pelos seus nomes. Conhecer a teoria e como utilizar o JNDI é essencial para o desenvolvimento J2EE.

Na figura abaixo temos uma ilustração de como o JNDI se encaixa no contexto do J2EE.

É através do JNDI que podemos localizar os seguintes recursos do J2EE:

  • Procurar por componentes Enterprise Java Bean
  • Armazenar fabrica de recursos com drivers JDBC e JMS
  • Obter a referência da transação do usuário (UserTransaction).
  • Obter DataSources e entradas de configuração da aplicação

Comentários (8)

Excelente artigo, mas gostaria que tivesse um exemplo usando J2ee.
postado por Lynton Lara Espinoza em 20/02/2007 às 23:21
Muito bom, mas realmente faltou um exemplo.
postado por Matheus em 25/04/2007 às 23:21
Realmente, só falto um exemplo
postado por William em 28/06/2007 às 23:21
+ 1 a favor do Exemplo.
postado por Fabio Aurelio Macil Lima em 10/01/2008 às 23:21
Bom dia Gleydson, Seu artigo está ótimo, pena que faltou um exemplo de uma mini aplicação. Estarei no aguardo de um exemplo prático... Abraços...
postado por Marcelo Freitas em 24/06/2008 às 23:21
Bom artigo me ajudou para fazer minha prova valeu!!!
postado por Amanda em 09/09/2008 às 23:21
Bom artigo, vai me ajudar a entender como o processador funciona na aquitetura (Com uma certa sorte, hehe)... =D
postado por Rodrigo Dutra de Oliveira em 30/03/2009 às 23:21
gostei do artigo, um exemplo cairia muito bem a ele... parabéns!
postado por Franklin em 18/11/2009 às 23:21
Comente!

Observações

Os campos em negrito são obrigatórios.

Para evitar problemas, este espaço é moderado. Após o envio do comentário será necessário aguardar pela sua aprovação.