190 likes | 293 Views
Tópicos Avançados em Sistemas Distribuídos. Java Naming and Directory Interface - JNDI. Serviço de Nomes. A principal funcionalidade de um serviço de nomes é permitir a associação de um nome (ou outra representação mais simples) a recursos computacionais como:
E N D
Guilherme Amaral Avelino - gavelino@gmail.com Tópicos Avançados em Sistemas Distribuídos Java Naming and Directory Interface - JNDI
Serviço de Nomes • A principal funcionalidade de um serviço de nomes é permitir a associação de um nome (ou outra representação mais simples) a recursos computacionais como: • Endereços de memória, de rede, de serviços; • Objetos e referências; • Códigos no geral. • Suas duas funções básicas são: • Associar • Localizar • Exemplos: • Sistema de arquivos • Sistema DNS /usr/bin/etc 10B0:1111 www.facid.com.br 74.55.112.146 Guilherme Amaral Avelino - gavelino@gmail.com
Ponteiros e referências • Muitas vezes o sistema não armazena o recurso identificado pelo nome, guarda apenas uma referência (ou ponteiro) para ele Nome #ponteiro Ligado a Objeto Guilherme Amaral Avelino - gavelino@gmail.com
Convenções de Nomenclatura • Cada serviço de nomes tem seu próprio mecanismo para fornecer um nome • Estruturas similares, mas com convenções diferentes geram incompatibilidades • Exemplos: • Nomes de arquivos Unix – requer que componentes de nomes sejam ordenados da esquerda para a direita e separados pelo caractere ‘/’. Ex: /usr/bin/arquivo.txt • Nomes de domínio – estabelece que componentes do mesmo nome sejam ordenados relativos a raiz do domínio (.com, .net, .br) da direita para a esquerda e separados pelo caractere ‘.’ . Ex: maq.subdom.dom.com.br • LDAP – pares nome-valor são ordenados da direita para a esquerda. Ex: tel=43222122, area=86, pais=55 Guilherme Amaral Avelino - gavelino@gmail.com
Nomes atômicos, compostos e federações • Nome atômico é o componente indivisível de um nome • arquivo.txt em c:\textos\arquivo.txt • usr em /usr/local/bin/java • org em jakarta.apache.org • Nome composto (CompoundName) é a combinação de zero ou mais nomes atômicos de acordo com uma certa convenção • Ex: nomes a direita no exemplo anterior • Federação (Federation ou CompositiveName) é um nome que mistura nomes de espaços de nomes diferentes. Exemplo: http://java.sun.com/products/j2ee/index.html • Espaço de nomes URL Scheme ID: http:// • Espaço de nomes DNS: java.sun.com • Espaço de nomes do sistema de arquivos: /products/j2ee/index.html Guilherme Amaral Avelino - gavelino@gmail.com
Contexto • É um conjunto de ligações nome objetos • Um contexto pode ser associado a outro contexto (subcontexto), fornecendo uma hierarquia para busca de nomes • A resolução de um nome (obtenção de um objeto associado) ocorre em um escopo limitado pelo seu contexto • 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, ... Guilherme Amaral Avelino - gavelino@gmail.com
Serviço de Diretório • Extensão natural de um serviço de nomes, ao qual são adicionados atributos • Atributos representam características dos objetos ligados • Objetos podem ser localizados pelos seus atributos • Ex: adição de e-mail a um nome de um usuário Guilherme Amaral Avelino - gavelino@gmail.com
Java NamingandDirectory Interface • Conjunto de APIs Java para acesso serviços de nomes e diretórios, onde: • O serviço de nomes associa nomes a objetos • O serviço de diretórios estende este conceito adicionando atributos as ligações • Facilita o armazenamento e compartilhamento de informações • Ex: uma impressora compartilhada Guilherme Amaral Avelino - gavelino@gmail.com
JNDI - Arquitetura • A JNDI é apenas uma API, não um serviço de atribuição de nomes e de diretórios • Para utilizar a JNDI é necessário que haja um serviço disponível • Fornece uma interface entre programas JAVA e serviços de atribuição de nomes • É independente de qualquer implementação de serviços de diretório e pode ser usado com qualquer um que implemente a ServiceProvider Interface para JNDI • Drivers JNDI em http://java.sun.com/products/jndi/serviceproviders.html Guilherme Amaral Avelino - gavelino@gmail.com
JNDI - Arquitetura Guilherme Amaral Avelino - gavelino@gmail.com
JNDI - Pacotes • javax.naming • Contém classes e interfaces para acesso ao serviços de atribuição de nomes • Context, Name, Binding • javax.naming.directory • Estende a classe Naming, adicionando funcionalidades para acesso a serviços de diretórios • Adiciona novas classes para atributos • Adiciona a interface DirContext, o qual representa um contexto de diretório e adiciona métodos para examinar e atualizar atributos associados a diretórios • javax.naming.event • Provê suporte para notificação de acessos a serviços de nomes e diretórios • NamingEvent e NamingListener Guilherme Amaral Avelino - gavelino@gmail.com
JNDI - Pacotes • javax.naming.ldap • Fornece suporte específico para o LDAP versão 3, adicionando funcionalidades específicas não cobertas pela javax.naming.directory • javax.naming.spi • Provê o meio através do qual desenvolvedores de diferentes servidores de nomes e diretórios possam integrar estes ao JNDI Guilherme Amaral Avelino - gavelino@gmail.com
JNDI - Contexto • Interface javax.naming.Context • Possui um método lookup para busca de nomes • Busca através de uma String • Busca através de um objeto da classe Name • Javax.naming.InitialContext • Contexto inicial de um serviço de nome • Pode se adicionar propriedades a este contexto através de um objeto HashTable Guilherme Amaral Avelino - gavelino@gmail.com
JNDI e J2EE • JNDI é um dos serviços padrões do J2EE • Tem por finalidade fornecer aos componentes de uma aplicação um padrão para acesso a recursos e outros componentes • Servidores de aplicação J2EE devem fornecer serviço JNDI, denominado ambiente de nomes que contém: • Ambiente de variáveis • Referências para os EJBs • Referências para as fábricas de recursos • JDBC, Jmail, JMS, etc Guilherme Amaral Avelino - gavelino@gmail.com
Usando o JNDI • Manipulando contextos • Cria contexto inicial • Contextic = newInitialContext(); • Busca em um contexto • Contextctx = (Context)ic.lookup(“subcontexto”); • Lista nomes e subcontextos • ic.List(“subcontexto”); • Cria subcontextos • ic.createSubcontext(“nome_subcontexto”); • Ligar um nome composto cria automaticamente todos os subcontextos intermediários exigidos. Ex: com/sams/publishing/book/j2ee • com, com/sams, com/sams/publishing, com/sams/publishing/book • Destroisubcontextos • ic.destroySubcontext(“nome_subcontexto”); Guilherme Amaral Avelino - gavelino@gmail.com
Usando o JNDI • Adicionando uma ligação • Usa o método bind(object, name) da classe Context Context ic = new InitialContext; Pessoa pessoa = new Pessoa(“Pedro”); ic.bind(“Gerente”, pessoa); • O objeto ligado deve implementar a interface Serializable • Exceções podem ser lançadas caso o nome já esteja ligado ou se o nome estiver errado Guilherme Amaral Avelino - gavelino@gmail.com
Usando o JNDI • Armazenando uma referência • Objeto grande demais • Objeto deve ser instanciado dinâmicamente • Provedor de serviço deve suportar objetos Referenceable • Exigências: • Objeto deve implementar a interface javax.naming.Referenceablee definir o método getReference(), o qual define o nome da classe referida e uma classe Factory, que pode ser utilizada para construir o objeto referenciado • Deve existir uma classe que implemente ObjectFactory fornecendo método necessário para criação de uma instância do objeto Guilherme Amaral Avelino - gavelino@gmail.com
Exercicio • Qual a função de um serviço de atribuição de nomes e de que forma ele facilita o desenvolvimento de aplicações distribuídas? • Qual a vantagem de se utilizar o JNDI ao invés de acessar diretamente um servidor de nomes e diretórios? • O que é um contexto? Como ele facilita a busca por uma ligação em um serviço de atribuição de nomes? • Quais são os principais pacotes de classes fornecidos pelo JNDI e para que são utilizados? Guilherme Amaral Avelino - gavelino@gmail.com
Exercicio • Cria a seguinte hierarquia de contextos e objetos (Fruit) usando a classes e métodos fornecidos pela API do JNDI. Guilherme Amaral Avelino - gavelino@gmail.com