EJB 3.0 - Acesso RemotoMarco A. S. Reishttp://marcoreis.net
Serialização
Recurso disponível desde a primeira versão do Java, permite que se salve o estado de um objeto em uma stream de dados.
Também permite que se recupere os dados da stream de volta em um objeto.
Para trocar objetos entre JVM's diferentes, é obrigatório implementar Serializable.
É assim que o RMI trabalha, tranferindo objetos entre diferentes máquinas.
Interface Remota
Um session bean pode ser local ou remoto, dependendo do uso que se pretende.
Se a aplicação rodar em apenas um servidor, podemos implementar apenas as interfaces locais.
Caso o sistema seja distribuído, e há diversas justificativas para isso, as interfaces devem ser remotas e os objetos envolvidos devem obrigatoriamente ser Serializable.
AppClient
Para acessar um componente remoto vamos criar uma aplicação cliente conforme o exemplo.
Library
Adicione a library do JBoss, conforme o modelo.
Cliente
Para acessar remotamente a aplicação cliente precisa das interfaces remotas, bem como das classes de entidades envolvidas.
Há várias formas de conseguir, uma delas é a função Export.
Especificação
Selecione as classes de entidade mais a fachada remota.
Indique o caminho da lib do novo projeto como destino das classes.
Serviços Remotos
Adicione a biblioteca recém-criada no classpath da aplicação.
AppClient
O projeto, ao final, deve conter os arquivos ao lado.
jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://192.168.1.101:1099
JBoss
Para iniciar o JBoss é importante observar os parâmetros de bind, habilitando o servidor a receber solicitações remotas:
run.bat (.sh) -c default -b 0.0.0.0 ou
run.bat (.sh) -c default –host=0.0.0.0 ou
run.bat (.sh) -c default -Djava.bind.address=0.0.0.0
ListaRecursosRemotos
package org.financeiro.remote;
import javax.naming.*;
public class ListaRecursosRemotos {
public static void main(String[] args) {
try {
Context ctx = new InitialContext();
NamingEnumeration<NameClassPair> lista = ctx.list("");
while (lista.hasMore()) {
NameClassPair proximo = lista.next();
System.out.println(proximo);
}
} catch (Exception e) {
}
}
}
ConsultaCorrentistasRemotos
package org.financeiro.remote;import java.util.*;import javax.naming.*;import org.financeiro.entidades.*;import org.financeiro.negocio.*;public class ConsultaCorrentistasRemotos { public static void main(String[] args) { try { Context ctx = new InitialContext(); Object proxy = ctx.lookup("FachadaCorrentista/remote"); IFachadaCorrentistaRemote fachada = (IFachadaCorrentistaRemote) proxy; // System.out.println("Lista de correntistas"); List<Correntista> listaDeCorrentistas = fachada.consultaTodos(); for (Correntista c : listaDeCorrentistas) { System.out.println(c.getId() + " - " + c.getNome()); } } catch (Exception e) { e.printStackTrace(); } }}
InsereCorrentistaRemoto
package org.financeiro.remote;
import java.util.*;import javax.naming.*;import javax.swing.*;import org.financeiro.entidades.*;import org.financeiro.negocio.*;
public class InsereCorrentistaRemoto { public static void main(String[] args) { try { Context ctx = new InitialContext(); Object proxy = ctx.lookup("FachadaCorrentista/remote"); IFachadaCorrentistaRemote fachada = (IFachadaCorrentistaRemote) proxy; // Correntista correntista = new Correntista(); correntista.setNome(JOptionPane.showInputDialog("Nome do Correntista")); correntista.setDataDeNascimento(new GregorianCalendar(1979, 4, 6) .getTime()); correntista.setTelefone("1234-5678"); fachada.inserir(correntista); JOptionPane.showMessageDialog(null, "Correntista inserido com sucesso"); } catch (Exception e) { e.printStackTrace(); } }}
Monitoração
A versão 5.0 do Java trouxe uma API completa para monitoração: JMX (Java Management Extension).
JMX Agent View
Para acessar a ferramenta de monitoração, acesse o endereço:
Http://localhost:8080/jmx-console
EJB's instalados
Clique na opção jboss.j2ee, que irá listar todos os beans instalados no servidor.
FachadaCorrentista
Verifique no InvokeStats as chamadas de cada método da fachada.