26 de mai de 2012

Entendo o funcionamento JNDI, Lookup e namespace

Neste artigo vamos fazer uma abordagem sobre Java Naming and Directory Interface  (JNDI) e lookup.
JNDI é uma API utilizada em aplicações que acessam recursos externos, ela permite obter esses recursos através do nome. Ela especifica a interface de serviço SPI e esse mecanismo permite que o suporte de vários serviços de diretório, como : LDAP, DNS, NIS, RMI, CORBA, entre outros. A aplicação que utiliza JNDI busca os recursos através de um método chamado lookup. Podemos fazer uma comparação com ponteiro, pois ao utilizar esta API uma referencias é feita ao recurso desejado.
Esta API possui um ambiente de configuração, e através dele podemos passar várias informações, estas devem ser informadas na criação de um contexto, podendo ser por um arquivo.properties ou um HashTable.

Caso um HashTable seja utilizado podemos inserir os seguintes paramentros:

  • Context.INITIAL_CONTEXT_FACTORY  → Utilizado para informar a classe responsável pela criação do InitialContext. Geralmente ela depende do servidor de aplicação utilizado na aplicação;
  • Context.PROVIDER_URL → Utilizado para informar a URL do provider. Também depende do servidor de aplicação utilizado;

Caso seja um serviço com autenticação, utilizamos os parâmestros abaixo para informa-las ao ambiente de configuração:

  • Context.SECURITY_PRINCIPAL → Para informar usuário;
  • Context.SECURITY_CREDENTIALS → Para informar a senha;

Caso um arquivo properties seja utilizado devemos definir os nomes :

  • java.naming.factory.initial → Utilizado para informar a classe responsável pela criação do InitialContext. Geralmente ela depende do servidor de aplicação utilizado na aplicação;
  • java.naming.provider.url → Utilizado para informar a URL do provider;
  • java.naming.security.principal → Para informar usuário;
  • java.naming.security.credentials →  Para informar a senha;

Os nomes colocados no arquivo properties são os mesmos representados pelos atributos da classe context ou InitialContext.
Os parametros mostrados anteriormente são os mais utilizados, mas temos diversos outros que podem ser encontrados na documentação da classe  javax.naming.Context;
É possível definir uma classe que faz a criação do InitialContext ao invés de utilizar uma classe fornecida por um servidor de aplicação, para isto deve-se estender a classe InitialDirContext  e também ter uma interface que implementa a interface DirContext.
Os recursos ficam armazenados em uma área que pode ser chamada de namespace, e nela podemos buscar tais recursos para a utilização em nossa aplicação, atravé do lookup.
Existem 3 tipos de namespace:

java:global
É a maneira portatil de busca remota de um EJB usando JNDI lookup.
Ela segue o seguinte padrão:
java:global[/application name]/module name/enterprise bean name[/interface name]
java:module
É a maneira de busca do EJB dentro do mesmo módulo.
java:module/enterprise bean name/[interface name]
java:app
É a maneira de busca do EJB dentro da mesma aplicação.
java:app[/module name]/enterprise bean name[/interface name]
Por exemplo, se um EJB , mybean, é empacotado dentro de um WAR  myApp.war, o nome do módulo é myApp. O nome JNDI portátil é java:module/mybean Um nome JNDI equivalente usando o java: namespace global é java:global/myApp/mybean.
Agora é hora de entender o funcionamento do lookup, como já sabemos ele é usado para fazer chamadas de recursos externos como EntityManager, EJBs, entre outros.
Para acessar qualquer um dos namespaces citados acima temos que utilizar o lookup e este método pode ser direto, ou seja, ele pode acessar diretamente o endereço do recurso no namespace global da aplicação ou portatil, ou seja, um endereço lógico é definido na aplicação para a chamada dos recursos, para isto deve-se usar o endenreço da seguinte forma “java:comp/env/nome_lógico.”
Agora com um entendimento sobre o lookup vamos discutir sobre a diferença entre usar um lookup portatil ou direto.
Lookup Direto e Portátil respectivamente:


Através das imagens podemos ter uma ideia do problema de usar um lookup direto, caso existam vários servidores ou vários containers EJB em um ambiente corporativo pode ser necessário a redefinição dos nomes JNDI, o que pode levar a um grande trabalho no momento de implantação e principlamente de integração da aplicação desenvolvida com sistemas que já estão em funcionamento.
No próximo artigos vamos mostrar como JNDI e lookup são implementados na prática em uma aplicação.

Nenhum comentário:

Postar um comentário