Bom, andei lendo alguns textos e obtive os seguintes entendimentos (algumas coisas que escreverei já foram ditas anteriormente, mas vale ressalta-las…rsrs). Sintam-se à vontade para mandarem mais cometários:
-
JNDI é uma API que possibilita acesso/registro de nomes em um serviço de diretórios implementado pelo servidor de aplicação, pois bem, ao anotarmos uma classe com @EJB, @Stateless, @PersistenteUnit, @PersistenteContext, etc estamos ordenando o servidor de aplicação (no me caso eh um JBOss 5.x AS) a registrar esses componentes anotados em sua árvore de diretórios através da JNDI API.
-
Ao identificar algumas anotações tais como @Stateless, @Statefull, o servidor registra esse “componente” no diretório “environment”, por isso temos “comp/env” (ainda não sei se todas as anotações indicam farão com que o servidor registro os componentes em comp/env). Enfim, os componentes serão publicados sob esquema java: e no diretório comp/env, portanto, o caminho completo eh “java:comp/env”.
-
Depois de registrados, os componentes e serviços serão recuperados através do mecânismo de lookup. Imagine que seja realizado um loouk de um componente para outro componente, por exemplo, tenho um serviço de cadastro de tarefas (CadastroTarefaService) e esse serviço fará um lookuk para o serviço de cadastro de pessoas, podemos fazer o seguinte:
//trecho de codigo implementado em um outro serviço CadastroTarefaService
InitialContext context = new InitialContext();
CadastroPessoaService cadastroPessoaService = context.looup("ejbcertificacao_ear/CadastroPessoaServiceImpl/remote-br.com.viniciusinformatica.ejbcertificacao.service.CadastroPessoaService");
onde ejbcertificacao_ear é o nome do meu arquivo de deploy .ear e CadastroPessoaServiceImpl é a classe que implementa meu serviço remoto. Veja que não necessitamos especificar o “java:comp/env” pois o serviço CadastroTarefaService foi publicado no mesmo diretório que CadastroPessoaService, portanto, a busca será relativa ao diretório “java:comp/env”. Resumindo, um componente buscará outro componente no diretório dos componentes “java:comp/env”.
- Suponha que tenhamos uma aplicação WEB cliente rodando em outra VM, essa mesma aplicação terá seu serviço de diretórios independente, então, para localizar o CadastroPessoaService teremos que criar e parametrizar um contexto, isto é:
//realizando a parametrizacao do contexto.
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
properties.put(Context.URL_PKG_PREFIXES, "org.jboss.namingrg.jnp.interfaces");
//aqui estou apontanto em qual servidor/porta buscaremos nossos recursos, servicos, componentes, etc.
properties.put(Context.PROVIDER_URL, "jnp://localhost:1099");
/*
* Inicializando o contexto e recuperando o diretorio de componentes. Devemos realizar essa parametrizacao pois estamos fora do container EJB
* onde residem os servicos.
*/
Context env = (Context) new InitialContext(properties).lookup("java:comp/env");
CadastroPessoaService cadastro = (CadastroPessoaService) env.lookup("ejbcertificacao_ear/CadastroPessoaServiceImpl/remote");
- Imagine que tenhamos do data source definido (novamente, estou trabalhando com o JBoss 5.x):
<datasources>
<local-tx-datasource>
<jndi-name>ejbcertificacaoPostgreSQLDS</jndi-name>
<connection-url>jdbc:postgresql://localhost:5432/ejbcertificacao</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<user-name>postgres</user-name>
<password>1234</password>
<min-pool-size>1</min-pool-size>
<max-pool-size>2</max-pool-size>
</local-tx-datasource>
</datasources>
Esse serviço será registrado na raiz “java:/”, com o nome “ejbcertificacaoPostgreSQLDS”. Se procurarmos esse recurso no console do servidor encontraremos “java:/ejbcertificacaoPostgreSQLDS”. Mas caso tenhamos esse recurso alterado para
<jndi-name>datasource/ejbcertificacaoPostgreSQLDS</jndi-name>
o recurso será encontrado do console do servidor como “java:/datasource/ejbcertificacaoPostgreSQLDS”. Notem que estamos organizando os recursos em uma estrutura de diretórios de acordo com sua categoria, pois poderiamos ter mais de 1 datasource, então organizariamos assim:
<jndi-name>datasource/ejbcertificacaoPostgreSQLDS</jndi-name>
<jndi-name>datasource/ejbcertificacaoMySQLDS</jndi-name>
<jndi-name>datasource/ejbcertificacaoOracleDS</jndi-name>
e seriam registrados no serviço de diretórios: “java:/datasource/ejbcertificacaoPostgreSQLDS”, “java:/datasource/ejbcertificacaoMySQLDS” e “java:/datasource/ejbcertificacaoOracleDS”. Notem que organizamos (registramos) todos os datasources no mesmo DIRETORIO!
é isso!
abrss