Lookup de EJB 3.0 Remoto

Fiz deploy de um EJB 3.0 Session Bean Stateless no JBoss 4.0.4-GA como um pacote JAR e consigo fazer o lookup remoto (outra JVM) numa boa, somente pelo nome da classe.

Agora, se eu faço o deploy do EJB dentro de um pacote EAR, ele não acha mais o EJB (name not bound).

Alguma dica?

Destro, o ejb3 deployer binda o ejb com um endereço do tipo

ear-name/bean-name/remote

Não seria isso?

Um beijo na boca… Funcionou!

Mas, putz… ter que colocar o nome do EAR mata… não tem como evitar isso?

Pois terei delegates rodando em outras VMs, remotamente. E também quero depender do nome do EAR.

Ter, tem. Tu poderia usar as anotações @RemoteBinding e @LocalBinding, pra garantir que o seus EJBs vão manter os mesmos endereços JNDI, independente de como eles foram empacotados.

Assim fico preso ao JBoss. Não queria isso.

O problema é que JEE/EJB nunca definiu como um componente deveria ser bindado no JNDI. Ou seja, mesmo se tu encontrar uma configuração do Jboss para que ele binde da mesma forma, sendo local ou remote, se você colocar no XPTO aplication server, ele pode bindar da forma que quizer, e lá se vai tua liberdade.

E pior, não acho que isso vai mudar tãooo cedo.

Que droga!

No meu Bean eu fiz:

Porém, quando eu faço o lookup remoto:

Ele me dá a mensagem de erro:

Ou seja, ele ignora no que vem a partir da barra (’/’). Porque será?

Estranho Daniel…Testou colocar lookup por outra string qualquer para ver se não ocorre um problema parecido?

Tentei, mas também deu problema.

Asim funcionou:

Ficou mais complicado isso.

Btw, uma dúvida destro: porque você não está usando os recursos de dependency injection do JEE 5?

@EJB(beanName="nome_ear/CadastroUsuario/remote") protected CadastroUsuario cadastroUsuario;

Porque meu Delegate (E ServiceLocator) fica remotamente e a idéia é que este EJB (Session Façade) seja um serviço.

Se fosse a mesma app (web/ejb) faria sentido.

[quote=plentz]Destro, o ejb3 deployer binda o ejb com um endereço do tipo

ear-name/bean-name/remote[/quote]

Exato: http://docs.jboss.org/ejb3/app-server/tutorial/ear/ear.html

a resposta =(

http://wiki.jboss.org/wiki/Wiki.jsp?page=Ejb3Jndi

se alguém achar algo mais simples me avisem, please.

Bom, a Sun mudou bastante a especificação dos EJBs, e do JavaEE, porém esqueceu ou deixou a desejar em detalhes simples e triviais.

Isso irrita!

Cara, algum de vocês dois pode me ajudar?

Olá, pessoal!

Já conheço o EJB 2.1 e agora estou estudando o 3.0.
Baixei o NetBeans 5.5 beta 2 com o Glassfish.
Fiz uma aplicação simples - e depois testei um dos exemplos
embutidos no NetBeans - com um EJB Stateless, mas o cliente
não consegue acessar o EJB: recebo uma NullPointerException ao
tentar usar a referência para o meu SessionBean, que, teoricamente,
não estaria Null devido à Injeção de Dependência.

Irei mostrar o código cliente, que é bastante simples:

public class Login {
   
    @EJB
    private static LoginRemote loginRemote;
   
    public static void main(String args[]) {
        Login login = new Login();
        String test = new String("thyago");
        login.callMeth(test);
    }
   
    public void callMeth(String teste) {
        try {
            System.out.println("Trying to log in the system...");
            loginRemote.login(teste);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } 
}

Depois de fazer o deploy, eu executo o código cliente e recebo uma NullPointer no “loginRemote.login(teste)”. Repito que a própria aplicação do NetBeans também lançou um NullPointer.

Alguém pode me ajudar?
Obrigado =]

A DI é feita dentro do próprio container JEE, não fora dele.

E o que eu precisaria alterar para poder chamar o EJB em um sistema Desktop? Eu estou deployando e executando a classe.

Properties env = new Properties(); // .. configure o 'env' para acessar o EJB remotamente Context ctx = new InitialContext( env ); SeuAmigo amigo = (SeuAmigo) ctx.lookup("nome_ear/SeuAmigo/remote"); amigo.digaOi();

Opa, Daniel!

Cara, brigado pela ajuda! Eu fiz isso ae em um computador na faculdade e funcionou, mas quando cheguei em casa e repeti o mesmo código o JBoss lança uma exceção:

Exception in thread "main" java.lang.NoClassDefFoundError: [Lorg/jboss/aop/advice/Interceptor;
        at java.lang.Class.getDeclaredFields0(Native Method)
        at java.lang.Class.privateGetDeclaredFields(Class.java:2259)
        at java.lang.Class.getDeclaredField(Class.java:1852)
        at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1582)
        at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:52)
        at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:408)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:400)
        at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:297)
        at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:531)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1908)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
        at java.rmi.MarshalledObject.get(MarshalledObject.java:135)
        at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:72)
        at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:652)
        at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
        at javax.naming.InitialContext.lookup(InitialContext.java:351)
        at teste.HelloCliente.main(HelloCliente.java:31)

Ce sabe o que pode ser isso?

E, só pra ilustrar o jeito como funcionou:

 public static void main(String args[]) {
        
        try {
            Hashtable prop = new Hashtable();
            prop.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
            prop.put(InitialContext.PROVIDER_URL, "jnp://localhost:1099");
            
            Context ctx = new InitialContext(prop);
            
            Object obj = ctx.lookup("HelloBean/remote");
            
            HelloRemote hello = (HelloRemote) obj;
            
            hello.sayHello();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Opa! Deu tudo certo, Daniel, muito obrigado, cara!