[RESOLVIDO]EJB 3.1 - funcionamento do looukp

Bom dia a todos, estou estudando o mecanismo de lookup/JNDI e tive o seguinte problema:

//tenho a seguinte interface remota
br.com.viniciusinformatica.ejbcertificacao.service.CadastroPessoaService

//tenho um Stateless Sesison Bean que implementa essa interface
CadastroPessoaServiceImpl

O texto que estou lendo indica que posso realizar um looupk dese componente atraves da String

String nomeComponente = "java:comp/env/ejbcertificacao_ear/CadastroPessoaServiceImpl/remote-br.com.viniciusinformatica.ejbcertificacao.service.CadastroPessoaService";
CadastroPessoaService cadastroPessoaService = context.looup(nomeComponente);

porem dessa maneira o componente não é encontrado, mas alterando a String eu consigo

String nomeComponente = "ejbcertificacao_ear/CadastroPessoaServiceImpl/remote-br.com.viniciusinformatica.ejbcertificacao.service.CadastroPessoaService";
CadastroPessoaService cadastroPessoaService = context.looup(nomeComponente);

É nesse ponto que surge a dúvida conceitual: qual é o significado de “java:comp/env” para a realização do looukp? Qual é o papel desse “java:comp/env” no serviço de diretórios JNDI?

vlww

so acrescentando você também consegue fazer o looukp no caminho real da classe, ou seja.

CadastroPessoaService cadastroPessoaService = context.looup(“br.com.viniciusinformatica.ejbcertificacao.service.CadastroPessoaService”);

Entao rogerioeerr, mas ainda resta a duvida, qual eh o significado de “java:comp/env” no lookup. Veja que se eu posso fazer o lookup da forma

CadastroPessoaService cadastroPessoaService = context.looup("br.com.viniciusinformatica.ejbcertificacao.service.CadastroPessoaService");

qual eh o sentido de fazer

CadastroPessoaService cadastroPessoaService = context.looup("java:comp/env/ejbcertificacao_ear/CadastroPessoaServiceImpl/remote-br.com.viniciusinformatica.ejbcertificacao.service.CadastroPessoaService");

??

vlww

isso sinceramente não sei responder, vamos aguardar alguem que tenha essa informação poste para que possamos descobrir rs

O java:comp/env é uma parte da árvore JNDI visível para um determinado componente. (comp = component, env = environment). Parece um pouco confuso escrevendo assim, mas com um exemplo é mais simples:

No arquivo web.xml vou criar uma referência para um EJB, dessa forma:

<ejb-local-ref>
  	<ejb-ref-name>meuEjbLocal</ejb-ref-name>
  	<local>com.teste.testeejb.ServicoEJBLocal</local>
  </ejb-local-ref>

No momento do deploy dessa aplicação, o container pega o EJB que implementa a interface local ServicoEJBLocal, e faz binding dentro de java:comp/env.

O código da aplicação web pode então acessar através do nome “java:comp/env/meuEjbLocal” . Mas apenas essa aplicação tem acesso, pois o nome está em seu espaço “particular” na árvore JNDI. Outra aplicação que acessar o java:comp/env enxergará seus próprios objetos.

Qualquer coisa fora do java:comp/env está na árvore global do container.

Ah, é importante mencionar uma coisa: esse negócio de como os objetos são nomeados na árvore JNDI não faz parte da especificação Java EE, por isso cada servidor implementa de um jeito. Os nomes mudam, às vezes alguns objetos são incluídos automaticamente no java:comp/env das aplicações, às vezes os ejbs locais não podem ser acessados pelo JNDI local… etc etc. Tem que ficar bem esperto com isso.

Se tiver alguma coisa que não ficou clara pode perguntar… tambem nao sou um grande especialista nesses detalhes mas ja quebrei a cabeça um pouco por causa deles hehe

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:

  1. 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.

  2. 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”.

  3. 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”.

  1. 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");
  1. 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