Solução JNDI Glassfish - CarrinhoBean

Boa tarde amigos,
tive dificuldades para efetuar lookup de um EJB no glassfish com uma aplicação standalone e percebi que muitos também tiveram o mesmo problema.
Encontrei a solução e achei por bem compartilhar rs… !

livraria-base.jar:
br/com/caelum/livraria/ejb/Carrinho.class
br/com/caelum/livraria/modelo/Livro.class

livraria-ejb.jar
br/com/caelum/livraria/CarrinhoBean.class

livraria.ear
|+ META-INF
|+ livraria-ejb.jar
|+ livraria-base.jar

[code]package br.com.caelum.livraria.ejb;

import java.util.List;
import br.com.caelum.livraria.modelo.Livro;

public interface Carrinho{

void addLivro(Livro livro);

List<Livro> getLivros();

double getTotal();

void finalizaCompra();

} [/code]

[code]package br.com.caelum.livraria.modelo;

import java.io.Serializable;

public class Livro implements Serializable {

private static final long serialVersionUID = 1L;
private String nome;
private double preco;

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public double getPreco() {
    return preco;
}

public void setPreco(double preco) {
    this.preco = preco;
}

}[/code]

[code]package br.com.caelum.livraria.ejb;

import java.util.ArrayList;
import java.util.List;
import javax.annotation.PreDestroy;
import javax.ejb.Remote;
import javax.ejb.Remove;
import javax.ejb.Stateful;

import br.com.caelum.livraria.modelo.Livro;

@Stateful
@Remote(Carrinho.class)
public class CarrinhoBean implements Carrinho {

private static final long serialVersionUID = 1L;

private List<Livro> livros = new ArrayList<Livro>();
private double total;


@Override
public List<Livro> getLivros() {
    return this.livros;
}

@Override
public double getTotal() {
    return this.total;
}

@Override
public void addLivro(Livro livro) {
    livros.add(livro);
    total += livro.getPreco();
    System.out.printf("Livro %s adicionado com sucesso!\n", livro.getNome());		
}

@Override
@Remove
public void finalizaCompra() {
	System.out.println("Finalizando a compra de: ");
	for (Livro livro : this.livros) {
		System.out.println(livro.getPreco()+" - "+livro.getNome());
	}
	
}
@PreDestroy
public void destroy(){
	System.out.println("Removendo uma instancia da Classe do Container");
}

}[/code]

Apicação cliente standalone:

Jboss segundo o exemplo foi efetuado com o jndi.properties no classpath do cliente + bibliotecas do JBoss.

Já no caso do glassfish não é necessário o jndi.properties e a lib no classpath que deve ser utilizado é apenas a gf-client.jar que se enconta no glassfish_home\glassfish\modules\ .

[code]package br.com.caelum.livraria.cliente;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import br.com.caelum.livraria.ejb.Carrinho;
import br.com.caelum.livraria.modelo.Livro;

public class CarrinhoClienteLivraria {
public static void main(String[] args) throws NamingException {
InitialContext ic = new InitialContext();

// Aqui é para o JBoss Carrinho carrinho = (Carrinho) ic.lookup("livraria-ear/CarrinhoBean/remote");

    // Glassfish
    Carrinho carrinho = (Carrinho) ic.lookup("java:global/livraria-ear/livraria-ejb/CarrinhoBean");

	
	Livro livro = new Livro();
	livro.setNome("Alice no País das maravilhas");
	livro.setPreco(15.0);
	
	carrinho.addLivro(livro);
	
	System.out.print(carrinho.getTotal());
	
	carrinho.finalizaCompra();
	
}

}[/code]

Fonte : https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB

Até a próxima,
Bom fim de semana a todos!

Amigo ap.junio@gmail.com ap.junio@gmail.com,
vc chegou a testar essa parte gf-client.jar
eu não consegui fazer funcionar
vc tem um exemplo funcional ai que vc possa me mandar?

Boa Tarde Giofranceno,

Cheguei a fazer o exemplo sim .
Estou no trabalho e não tenho os fontes aqui, mas assim que chegar em casa lhe envio.

Abraços!

fico muito grato, AdemarJr.

Obrigado mesmo, estou com uma dificuldade enorme com isso.

se puder envie o exemplo no e-mail: giofranceno@hotmail.com

Valeu, t+.

Beleza a noite lhe envio,
Abraços !

Ademar Jr,

Eu vi que você colocou no classpath do applicativo cliente gf-client-module.jar,
mas no meu caso não funcionou, rodando o aplicativo fora do NetBeans.

java -jar nomedaaplicacao.jar

o erro que acontece é esse:
Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

Obs.: Pelo NetBeans ele funciona normalmente

Você sabe o que pode ser?

Agradeço desde já, t+.

Boa noite Amigo,

se você empacotar seu loja-client em um cliente enterprise vc pode executar o seguinte comando:

appclient -client <seu_projeto.jar>

Até mais !

Opa,

Boa noite Amigo
Agora funcionou mas somente na maquina em que o servidor está Iniciado,
Não consigo executar esse mesmo .jar em outra máquina,
conectando neste servidor iniciado em outra máquina.

vc sabe o que pode ser?
Obrigado.

Simples, no InitialContext você precisa especificar qual a máquina e porta que seu serviço está disponível.

 Properties props = new Properties();
 props.setProperty(InitialContext.PROVIDER_URL, 192.168.0.12:1099); //endereço da maquina e a porta. Por padrão a porta a se utilizar é a 1099

 InitialContext ic = new InitialContext(props);  //instancia o InitialContext  e prossegue com o lookup em seguida.

a porta padrão do glassfish não é a 3700?

Verdade.
1099 é do JBoss.

Ademar Jr.

Estou com um problema, não quero chamar minha aplicação através do console "appclient -client Projeto.jar"
como faço para não precisar chamar pelo console?

desde já agradeço a compreensão, obrigado.

Aproveitando o tópico…
Nâo estou conseguindo criar um EJBContainer… Estou seguindo um exemplo do mesmo llink que foi posto como fonte do primeiro exemplo do post. Já botei o glassfish-embedded-static-shell.jar no classpath do cliente porém continua dando o seguinte erro:

Exception in thread "main" javax.ejb.EJBException: No EJBContainer provider available: no provider names had been found. at javax.ejb.EJBContainer.reportError(EJBContainer.java:180) at javax.ejb.EJBContainer.createEJBContainer(EJBContainer.java:117) at javax.ejb.EJBContainer.createEJBContainer(EJBContainer.java:77) at br.com.arenasoft.ejb.main.PrincipalEJBContainer.main(PrincipalEJBContainer.java:11)

Alguem saberia dizer o que eu posso estar fazendo errado?