EJB 3.1 - Lookup Glassfish JNDI (Aplicação StandAlone)

Pessoal, bom dia!

Estou iniciando os estudos sobre EJB 3.1. Até o momento, consegui montar um exemplo utilizando a interface Local via D.I. (@EJB) e via lookup,
também consegui utilizar uma interface remota para uma aplicação Client na mesma JVM. Porém, não estou conseguindo
rodar meu Client em outra máquina, pois mesmo configurando (propriedades de acesso / lookup JNDI (Global) / Colocando as libs do meu EJB e gf-client no class path)
quando executo o Client ocorre a exception abaixo:

[color=red]24/10/2011 11:39:40 dadoclientapp.Main main
GRAVE: null
javax.naming.NameNotFoundException: No object bound for java:com/DadoServer/DadoServer-ejb/LancaDadoBean!sessionbean.LancaDadoBeanRemoto [Root exception is java.lang.NullPointerException]
at com.sun.enterprise.naming.java.javaURLContext.lookup(javaURLContext.java:196)
at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:307)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at dadoclientapp.Main.main(Main.java:33)
Caused by: java.lang.NullPointerException
at com.sun.enterprise.naming.java.javaURLContext.lookup(javaURLContext.java:190)
… 3 more[/color]

Meu EJB:
Interface Remota:

[code] package sessionbean;
import javax.ejb.Remote;

    @Remote
    public interface LancaDadoBeanRemoto {
        int lancaRomoto();
    }[/code]

  
  Implementação da Interface:

[code] package sessionbean;
import java.util.Random;
import javax.ejb.Stateless;

    @Stateless
    public class LancaDadoBean implements LancaDadoBeanRemoto {
        private Random gerador = new Random();

        public int lancaRomoto(){
            return this.gerador.nextInt(5) + 1;
        }
    }

[/code]

Aplicação Client (EM outra Máquina):

[code] package dadoclientapp;

    import java.util.Properties;
    import javax.naming.InitialContext;
    import sessionbean.LancaDadoBeanRemoto;
    public class Main {
        public static void main(String args[]) {
                Properties props = new Properties();
                props.put("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
                props.put("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
                props.put("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
                props.put("org.omg.CORBA.ORBInitialHost", "192.168.0.125");
                props.put("org.omg.CORBA.ORBInitialPort", "3700");

                InitialContext ctx = new InitialContext(props);
                LancaDadoBeanRemoto beanRemote = (LancaDadoBeanRemoto) ctx.lookup("java:com/DadoServer/DadoServer-ejb/LancaDadoBean!sessionbean.LancaDadoBeanRemoto");
        
                System.out.println("Valor do Dado: " + beanRemote.lancaRomoto());
         }
    }[/code]

Acredito estar correto o meu Lookup, pois quando implantei o EJB no Servidor via NetBeans o Log do GlassFish apresentou este caminho para configuração JNDI name.
Desconfio de 2 coisas:

  1. Algo relacionado as propriedades de conexão;
  2. ALguma configuração especifica no meu Glassfish (Liberação de Porta ou algo do genero);

Há 2 dias estou tentando realizar tal configuração, mais ta complicado - nas minhas pesquisas só encontrei exemplos picados na net.
Alguém pode me dizer onde estou errando?

Obrigado

cara,

uma pergunta simples, a maquina que está a aplicação cliente pinga esse ip 192.168.0.125?

segue um exemplo
http://edwin.baculsoft.com/2010/09/a-simple-java-client-server-application-using-ejb3-and-glassfish3/

t+

Primeiramente gostaria de agradecer pela força.

Então cara,

Executei o ping na minha máquina “Client”, a conexão de rede com a máquina “Server” ta blz. Dei uma olhada no link que vc me passou
mais nesse caso o autor do post utiliza “Server / Client” na mesma JVM, da uma olhada no lookup que ele configurou,
ele só especificou o pacote + nome do Bean, quando temos o Client / Server em máquinas diferentes,
devemos especificar um JNDI Name (me corrija se eu estiver errado, pois sou novo em EJB). :b

Forma que está no post:

ctx.lookup (ConnectionFacadeRemote) ( "com.edw.facade.ConnectionFacadeRemote" );

Forma que configurei:

ctx.lookup("java:com/DadoServer/DadoServer-ejb/LancaDadoBean!sessionbean.LancaDadoBeanRemoto");

Você sabe se preciso configurar alguma coisa no admin do Glassfish? (Ativar serviço, configurar porta ou algo assim)

Obrigado.

Corrigindo,

Forma que configurei

ctx.lookup("java:global/DadoServer/DadoServer-ejb/LancaDadoBean!sessionbean.LancaDadoBeanRemoto");

cara,
eu tinha visto que era localhost, te passei para vc poderia tirar alguma ideia.
eu nunca fiz um tipo de aplicação assim, mas vo tentar te dar um help.

mais uma coisa, se vc der um telnet da maquina cliente no ip + porta, ta indo blz.

da uma olhada nesse link ai tbm, http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#AppClientDef

t+

Cara,

Já segui alguns tutoriais, consultei o prof de Java da Facul. e
parece estar certo minhas configurações, vou testar com JBOSS.
Se não rolar vou tentar em outro ambiente de rede.

Quando resolver, posto aqui para ajudar o pessoal.

Valeu pela ajuda !!!

É pessoal,

Até consegui utilizando o JBOSS, mas mudar de servidor não é a solução.
Se Alguém souber como fazer o LookUp Remoto utilizando o Glassfish e puder ajudar seria legal.
Quero colocar [Resolvido] nesse Tópico galera.

Abraços,

Olá Marcio, tudo bem?

Vc conseguiu fazer lookup utilizando o Glassfish 3.1?
Estou passando pelo mesmo problema que você teve, já segui vários tutoriais, e inclusive já conhecia alguns links que foram postados neste tópico.

Vc tem alguma sugestão?
Obrigado

Ola Leandro,

Desculpe, mas não cheguei a concluir o lookup através do Glassfish pois troquei de emprego antes da conclusão do projeto.
Me lembro que passei por muita dificuldade realmente, inclusive ninguem conseguiu me ajudar realmente.

Se alguem souber dar uma força… Também gostaria de saber

Cara, obrigado pelo retorno e eu consegui resolver neste domingo :slight_smile:

Este link http://anirbanchowdhury.wordpress.com/2012/06/07/ejb-3-application-in-glassfish-3x/ me ajudou bastante a solucionar o problema, principalmente na parte “Some comom errors” e no detalhe da anotação da classe EJB @Stateless(name="PlaceAuctionItem", mappedName="ejb/PlaceAuctionItem"), que facilita o entendimento na hora de fazer o lookup, pois ficou claro que deve-se utilizar o nome “ejb/PlaceAuctionItem”.

Outro detalhe importante é que eu estou fazendo lookup na mesma máquina do Glassfish, e deste modo eu precisei apenas dos três .jar que o artigo pede para incluir no projeto cliente. Meu próximo passo será separar essa estrutura.

Abs.

Legal,

Me lembro que foi exatamente no momento de separar a estrutura que comecei a ter problemas, pois até então quando está executando o Client / Server na mesma máquina, você está utilizando a mesma JVM (INTERFACE LOCAL)…

Boa sorte ae cara, qq coisa da um toque!!!

Resolvi meu problema, migrei para o JBoss 7.1.1, li este tutorial https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDI e no meu primeiro teste tudo funcionou do jeito que eu queria, mas usando JBoss ao invés do Glassfish.

Desisti do Glassfish e já estou migrando minha aplicação para o JBoss.

Abs