Marco A. S. Reis http://marcoreis.net EJB 3.0 - Acesso Remoto Marco A. S. Reis http://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.