Tecnologias de Distribuição e Integração Application Server JavaEE – Framework para o Servlets Web desenvolvimento de aplicações distribuídas Session DBMSs JSP Client Beans em JavaJSFcom 3 camadas Message Driven Beans Web Container Rich client application Message Queues EJB Container Connectors Brokers Entity Entity Classes Classes Client app container Presentation Tier Logic Tier Resource tier TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP 2 EJBs Session Beans – Objecto sem persistência permanente contendo a interface para a lógica de negócio. Deve ser o tipo de objecto directamente invocado pela camada de apresentação Message-driven Beans – Actuam como receptores de mensagens (JMS) em arquitecturas assíncronas. Geralmente aparecem como intermediários entre os clientes (que enviam mensagens) e Session Beans Entities – Objectos com persistência que representam a informação necessária à lógica de negócio (na forma de objecto). Implementam uma ligação a uma base de dados Síncronos Entities Assíncronos Session Message Driven CMP BMP Stateless Stateful Outrora considerados EJBs e correndo num EJB container, passam (a partir da versão 1.5) a ser independentes e a constituirem uma API autónoma (JPA). TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP CMP – Container managed persistence (automática) BMP – Bean managed persistence 3 TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP 4 External Client Application Server Comunicação síncrona Session Bean Remote Interface WS Endpoint Cliente Local Client MDB JVM Queue Local Interface Web Service Client EJB EJB container WS Entity DB Comunicação assíncrona IS TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP 5 import javax.ejb.Local; import javax.ejb.Stateless; @Local public interface NameBeanLocal { ….. local methods ….. } @Stateless public class NameBean implements NameBeanLocal, NameBeanRemote { public NameBean () { … } Anotações TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP JNDI – Java Naming and Directory Interface registo dos diversos recursos disponíveis num JavaEE application server ….. implementação das interfaces ….. } import javax.ejb.Stateful; import javax.ejb.Remote; @Remote public interface NameBeanRemote { ….. remote methods ….. } 6 @Stateful Utilização de recursos @Resource Intercepções @PostConstruct @PreDestroy @PreActivate (stateful) @PrePassivate (stateful) @Remove (stateful) TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP 7 TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP 8 Executam num ambiente especial, designado de “Application Client Container” Dependente do Application Server particular (exemplos no Glassfish): Comunicam com o servidor usando RMI ou RMI-IIOP e o serviço JNDI javac -classpath %GLASSFISH_HOME%\lib\javaee.jar -d ./classes *.java Através de uma anotação: Lookup explícito: import javax.naming.*; import javax.naming.*; @EJB NameBean nb; NameBean nb; ….. InitialContext ic; ic = new InitialContext(); …. nb. ….. …. Compilação: não necessário se instalado no application server Packaging (colocar em arquivo .jar as classes do EJB): EJB Deploying: %GLASSFISH_HOME%\bin\asadmin deploy --host localhost --port 4848 --user admin --passwordfile %GLASSFISH_HOME%\passfile --upload=true --target server …….\NameBean.jar ….. InitialContext ic; ic = new InitialContext(); nb = (NameBean) ic.lookup( NameBean.class.getName() ); …. nb. ….. …. Quando da compilação do cliente é necessário colocar em classpath: javaee.jar (do AS) e as classes dos EJBs referenciados cliente Running: Executam com “appclient –client ….jar” (em Glassfish) TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP @WebService @WebMethod %GLASSFISH_HOME%\bin\appclient -client ….\Client.jar 9 TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP • Publisher/Subscriber Subscriber No glassfish: Construir proxy com o comando wsimport: Publisher Topic %GLASSFISH_HOME%\bin\wsimport -keep -d ….. http:// …. ?wsdl @Stateless @WebService Public class ……… { public ……… () { … } @WebMethod public ………… ( … ) { … } } 10 Os serviços de mensagens em Java usam a especificação JMS (Java Messaging Service) – implementada por vários fornecedores e ASs Usar as anotações para classe e métodos Cliente (via proxy): Import javax.ejb.Stateless; Import javax.jws.WebMethod; Import javax.jws.WebService; jar cvf ….. Subscriber … WSSessionBeanService service = new WSSessionBeanService(); WSSessionBean port = service.getWSSessionBeanPort(); JMS String result = port.hello("world"); … • Point to point Receiver obtenção da instância do proxy Sender Queue Dentro de um “application client container”: Receiver @WebServiceRef(wsdlLocation = "http:// …. ?wsdl") private static WSSessionBeanService service; WSSessionBean port = service.getWSSessionBeanPort(); String result = port.hello("world"); TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP JMS Os MDBs podem funcionar nos dois modelos 11 TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP 12 @MessageDriven(mappedName = "jms/TestQueue", activationConfig = { @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") }) @Resource(name = "jms/TestQueue") private static Queue testQueue; @Resource(name = "jms/TestQueueFactory") private static ConnectionFactory testQueueFactory; public class QueuedBean implements MessageListener { public QueuedBean() { } Connection connection = null; Session session = null; Message msg = null; public void onMessage(Message message) { if (message instanceof TextMessage) { TextMessage msg = (TextMessage) message; String stMsg = msg.getText(); ... } } } connection = testQueueFactory.createConnection(); session = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(testQueue); Tipos de Mensagens: ByteMessage MapMessage ObjectMessage StreamMessage TextMessage - array de bytes (serialização manual) conjunto de nomes/valores objecto (serializável) sequência de valores de tipos primitivos um string TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP Pooling de objectos Transacções em entity beans e MDBs Persistência – em stateful session beans e entity beans (automática nos CMPs) Segurança – pode ser orientada aos métodos expostos Messaging – em message driven beans TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP msg = session.get...Message(); ... messageProducer.send(msg); 13 TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP 14 ATM Web Banking or Bank teller Uma aplicação bancária 15 TDIN - MIEIC - 2008/2009 - Nuno Flores - FEUP 16