Acesso Remoto EJB utilizando OpenEJB

15 respostas
Diego.G.A

Eu ja pesquisei na net sobre como acessar o bean remoto do EJB no OpenEJB porem o serviço de deploy dos meus EJBs estão sendo levantados pelo tomcat com o OpenEJB.
eu queria saber com configurar o openEJB no tomcat para que eu possa acessar os meus EJBs remotos.

15 Respostas

Andre_Brito

Olá. Bom encontrar mais um usuário do OpenEJB por aqui! Você pode me encontrar (e encontrar os commiters e o chairman do OpenEJB) no canal #openejb, na freenode.

Seguinte, nunca usei com o Tomcat. Você consegue fazer o lookup sem ser usando o Tomcat? Usando o Tomcat, teoricamente, deve ser a mesma coisa. Você cria o contexto e faz o lookup de algum session que foi deployed no servidor. Em que ponto você está travando?

Diego.G.A

eu quero fazer um lookup para um EJB remoto que eu criei só que não sei em que porta esta rodando o RMI do OpenEJB para eu poder fazer o lookup.

Andre_Brito
Quando você starta o OpenEJB, é possível ver o ip e as portas. Se você quer fazer o lookup de um ejb, pode usar a seguinte property na hora de criar o contexto:
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
properties.put(Context.PROVIDER_URL, "ejbd://" + serverAddress + ":4201");

InitialContext initialContext = new InitialContext(properties);

// lookup
Onde serverAddress é o endereço do seu servidor (se estiver no localhost, dá pra usar "localhost" ou "127.0.0.1").
Diego.G.A

Só que eu to iniciando o serviço do openejb pelo tomcat e não esta aparecendo os dados do ip.
e quando tento fazer isso que vc falou ele não funciona da erro.

Andre_Brito

Qual erro que dá?

No arquivo OPENEJB_HOME/conf/ejbd.properties tem o ip. Se você quiser mudar, acredito que pode mudar por ali. Se não der certo, poste mais algumas informações que a noite eu faço um exemplo simples de como usar os dois juntos.

Editado.
Como você faz o deploy da aplicação?

Diego.G.A

cara é o seguinte, eu instalei o openEJB no tomcat, só isso.
coloquei o war dentro da pasta webapps depois abri a aplicação cliquei no link de instalar e depois reiniciei o tomcat.
ai eu construi uma aplicação web com ejb local e funcionou tudo blz.
depois contrui um ejb remoto e distribui ele no tomcat, se eu chamar ele por qualquer aplicação no tomcat ele funciona, mas se eu chamar ele de uma plicação desktop
ele não consegue achar o serviço.

Andre_Brito

Ahh… Então pelo tomcat funciona de boa, mas pela aplicação desktop não. É isso?
Então, quando você for fazer o lookup, no código da aplicação, por algum ejb, você faz da mesma forma que é feito no tomcat. Por exemplo, se pra acessar a aplicação via navegador você tem que digitar lá:

Você vai pegar esse localhost (no caso, se estiver usando algum ip, vai pegar o ip) e vai setar na propriedade que te falei no lookup. Se você está usando localhost, taca localhost lá mesmo:

properties.put(Context.PROVIDER_URL, "ejbd://localhost:4201");

Se não funcionar, tenta colocar a porta 8080. Se ainda assim não funcionar, dá uma olhada no ejbd.properties que fica na pasta conf do OpenEJB.

Se depois disso ainda der um erro, posta o erro aqui.

Diego.G.A

Cara esse é o código que eu to usando para acessar o meu serviço.
esse código fica na aplicação cliente.

import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class App {

    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
        properties.setProperty(Context.PROVIDER_URL, "ejbd://192.168.14.102:4201");
        try {
            InitialContext context = new InitialContext(properties);
            Calculator calculator = (Calculator) context.lookup("calculatorBeanRemote");

            System.out.println("Saida 1: "+ calculator.sum(15, 5));
        } catch (NamingException ex) {
            ex.printStackTrace();
        }
    }
}

la no tomcat que esta o meu EJB

import javax.ejb.Remote;


@Remote
public interface Calculator {

    public double sum(double num1, double num2);

}
import javax.ejb.Stateless;


@Stateless(name="calculatorBean")
public class CalculatorImpl implements Calculator {

    @Override
    public double sum(double num1, double num2) {
        return num1 + num2;
    }

}

essas classes de EJB ficam dentro do tomcat o openEJB esta instalado no tomcat e não esta rodando separado.
e quando eu vou olhar o logo do tomcat e do openEJB ele não exibe os dados do IP para acesso remoto.
eu ja coloquei um arquivo properties no conf do tomcat para que o openejb leia pôs o OPENEJB_HOME e a pasta raiz do tomcat.
ejbd.properties

ejbd.disabled=false
ejbd.bind=192.168.14.102
ejbd.server=org.apache.openejb.server.ejbd.EjbServer
ejbd.port=4201
ejbd.name=ejbd
ejbd.threads=200

só que quando eu inicio o tomcat o openejb inicia dentro do tomcat mas não exibe no logo os dados de acesso remoto.
quando rodo a aplicação cliente ele da a exception que não esta conseguindo conectar no host

WARNING: Failover: Cannot connect to server(s): ejbd://192.168.14.102:4201 Exception: Cannot connect to server 'ejbd://192.168.14.102:4201'.  Check that the server is started and that the specified serverURL is correct..  Trying next.
javax.naming.NamingException: Cannot lookup '/calculatorBeanRemote'. [Root exception is java.rmi.RemoteException: Unable to connect; nested exception is: 
        java.rmi.RemoteException: Cannot connect to any servers: Server #0: ejbd://192.168.14.102:4201]
        at org.apache.openejb.client.JNDIContext.lookup(JNDIContext.java:224)
        at javax.naming.InitialContext.lookup(InitialContext.java:392)
        at App.main(App.java:20)
Caused by: java.rmi.RemoteException: Unable to connect; nested exception is: 
        java.rmi.RemoteException: Cannot connect to any servers: Server #0: ejbd://192.168.14.102:4201
        at org.apache.openejb.client.Client.processRequest(Client.java:80)
        at org.apache.openejb.client.Client.request(Client.java:59)
        at org.apache.openejb.client.JNDIContext.request(JNDIContext.java:80)
        at org.apache.openejb.client.JNDIContext.lookup(JNDIContext.java:218)
        ... 2 more
Caused by: java.rmi.RemoteException: Cannot connect to any servers: Server #0: ejbd://192.168.14.102:4201
        at org.apache.openejb.client.StickyConnectionStrategy.connect(StickyConnectionStrategy.java:80)
        at org.apache.openejb.client.ConnectionManager.getConnection(ConnectionManager.java:54)
        at org.apache.openejb.client.Client.processRequest(Client.java:78)
        ... 5 more
Andre_Brito

Estou dando uma estudada no seu problema.
Mais tarde volto a te responder.

Só mais uma coisa. Se você não configurou a forma de acessar seus EJBs (no ejb-jar.xml), ele vai pegar assim: NomeDoSessionRemote.

Andre_Brito

Onde for o seu ip, tente o seguinte:

properties.setProperty(Context.PROVIDER_URL, "http://192.168.14.102:8080/openejb/ejb");

E me diz o que acontece.

Diego.G.A

Valeu Andre funcionou usando http.

Eu queria saber como faço para configurar o openEJB com ejbd para rodar no tomcat?:

Andre_Brito

Não entendi. Pode explicar melhor?

Diego.G.A

Tipo o exemplo que você me passou esta trabalhando com protocolo http.
ex:

properties.put(Context.PROVIDER_URL, "http://" + serverAddress + ":8080/ejb");

eu queria chamar usando o protocolo ejbd.
ex:

properties.put(Context.PROVIDER_URL, "ejbd://" + serverAddress + ":4201");
Andre_Brito

Cara, eu acho (ACHO) que não tem como fazer isso. Você está acessando um conteiner através do Tomcat, e não o contrário. Dessa forma, se você precisa do Tomcat pra acessar o OpenEJB, (i.e., você precisa do http pra acessar o conteiner que fica dentro do Tomcat, nesse caso o Open).

Se você quer acessar como ejbd, vai ter que achar uma outra forma de embutir o OpenEJB (ou encontrar alguma forma de fazer o conteiner startar o Tomcat). Enfim… aconselho você a trocar uma ideia com o David Blevins (#openejb na freenode). Ele é um cara extremamente acessível.

Diego.G.A

Blz vou verificar isso, valeu pela ajuda!

Criado 13 de julho de 2010
Ultima resposta 21 de jul. de 2010
Respostas 15
Participantes 2