PRÁCTICA 3: COMPONENTES Javier Sánchez Pérez Arquitectura del Software Grado en Informática Contenidos • Java EE • Enterprise Java Beans • Stateless Session Beans • Stateful Session Beans • Singleton Session Beans • Message-driven Beans • Práctica 3: Componentes Java EE Aplicaciones Applets Páginas Web Nivel Cliente Servlets Java Server Pages Java Server Faces Nivel Web EJBs DDBB Nivel Negocio Nivel EIS Java EE Contenedor Applet Contenedor Web Contenedor EJB Applet Servlet, JSF, JSP EJB Contenedor Cliente Applicación Enterprise Java Beans • Desarrollo por componentes • Componentes en el servidor • Simplifican el desarrollo • Aplicaciones cliente más sencillas • Reutilizables Enterprise Java Beans Servidor de Aplicaciones Contenedor EJB Conjunto de EJB Servicio de Transacciones Servicio de Directorio Gestión Ciclo de Vida Persistencia Conexiones Hilos Servicio de Seguridad Enterprise Java Beans • Tipos de EJBs • Session Beans (Stateless, Stateful, Singleton) • Message-driven Beans • Anotaciones (local) • @EJB, @Remote, @Local, @Stateless • JNDI lookup (remoto) • java:global[/application]/module/ejb[/interface] • java:app[/module]/ejb[/interface] • java:module/ejb[/interface] • Tipos de cliente: • Remoto, local o Web Service Enterprise Java Beans • Declaración @Session public class Bean { ... } • Interfaces de Negocio @Local public interface Interface { ... } @Local(Interface.class) public class Bean implements Interface{...} Enterprise Java Beans • Interfaces de Negocio @Remote public interface Interface { ... } @Remote(Interface.class) public class Bean implements Interface {...} Enterprise Java Beans • Acceso local por anotaciones @EJB Bean miBean; • Acceso local por JNDI Bean miBean=(miBean)InitialContext.lookup ("java:module/Bean"); Enterprise Java Beans • Acceso remoto por JNDI miBean=(Interface)InitialContext.lookup ("java:global/application/Bean"); Session Beans • Interacción con un cliente • Mantiene su información • Media entre cliente y otros componentes • Dos tipos • Stateless • Stateful Stateless Session Beans • Ciclo de vida PostConstruct No existe Ready PreDestroy @PostConstruct @PreDestroy Stateless Session Beans //en el servidor @Stateless public class ConverterBean { private float yenRate = 83.0602; private float euroRate = 0.0093016; public float dollarToYen(float dollars) { return dollars * yenRate; } public float yenToEuro(float yen) { return yen * euroRate; } } Stateless Session Beans //en el cliente utilizando anotaciones ... @EJB Bean miBean; float conv = miBean.dollarToYen(dolares); ... Stateful Session Beans • Ciclo de vida PrePassivate PostConstruct No existe Ready PreDestroy @PostConstruct @PrePassivate @PostActivate [cliente] – @Remove @PreDestroy Passive PostActivate Stateful Session Beans //la interfaz de negocio @Remote public interface Cart { public void addBook(Book book); public void removeBook(Book book); public void remove(); } //en el servidor @Stateful public class CartBean implements Cart { ... public void addBook(Book book) {...} public void removeBook(Book book) {...} @Remove public void remove() {...} } Stateful Session Beans //en el cliente ... CartBean miBean=(CartBean)InitialContext.lookup ("java:global/application/CartBean/Cart"); miBean.addBook(book1); ... miBean.remove(); ... Singleton Session Beans • Ciclo de vida PostConstruct No existe Ready PreDestroy @Startup @PostConstruct @PreDestroy Singleton Session Beans //en el servidor @Startup @Singleton public class StatusBean { ... @PostConstruct void init() {...} @lock(LockType.READ) public State getState() {...} @lock(LockType.WRITE) public State setState() {...} } Message-driven Beans • Se activan por mensajes • Java Message Service (JMS) • Asíncronos • Tiempo de vida corto • Stateless • No tienen interfaces Message-driven Beans • Ciclo de vida onMessage PostConstruct No existe Ready PreDestroy @PostConstruct @PreDestroy Message-driven Beans //en el servidor @MessageDriven public class MessageBean implements MessageListener{ ... @PostConstruct void init() {...} public void onMessage(Message m) {...} } Message-driven Beans //en el cliente ... @Resource(mappedName="jms/ConnectionFactory") private static ConnectionFactory connectionFactory; @Resource(mappedName="jms/Queue") private static Queue queue; ... connection = connectionFactory.createConnection(); session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); messageProducer = session.createProducer(queue); ... message = session.createTextMessage(); message.setText("This is a message"); messageProducer.send(message); Práctica 3: Componentes • Objetivos: • Desarrollo Componentes del Nivel de Negocio • Separación de los niveles (Cliente, Web, Negocio) • Tareas: • Cargar distintas fases con Stateful Bean • Guardar puntuación y mostrar ranking con Stateless Bean • Opcional • Visualización de estadísticas con Singleton Bean • Envío de mensajes Cliente-Servidor con Message-driven EJB Práctica 3: Componentes CLIENT TIER <<JApplet>> Principal PhaseConnection PhaseLoader +loadPhase(p: int): Drawable Se conecta a un Stateful Session Bean SceneController Ranking -scores: List ScoreSaver +getScores(): List +saveScore(id: String, score: Integer): Ranking Score -score: Integer +getScore(): Integer ScoreConnection Se conecta a un Stateless Session Bean Brick CollisionListener +onCollision(d: Integer)() Práctica 3: Componentes WEB TIER <<Servlet>> PhaseServlet BUSINESS TIER <<Stateful Session Bean>> PhaseBean -currentPhase: Integer DBPhase +nextPhase(): Drawable +@Remove finish() PhaseLoader +loadPhase(p: int): Drawable <<Servlet>> ScoreServlet <<Stateless Session Bean>> ScoreBean +saveScore(id: String, score: Integer): Ranking Ranking -scores: List +getScores(): List DBScore ScoreManager +saveScore(id: String, score: Integer) +loadRanking(): Ranking Práctica 3: Componentes [opcional] WEB TIER BUSINESS TIER <<Singleton Session Bean>> StatisticBean <<Servlet>> StatisticServlet -id_users: List -execution_times: List -user_state: List Estadística de cuántos usuarios se han conectado, durante cuánto tiempo y cuál es su estado. +getStatistics(): List <<Message-driven Bean>> MessagesBean +onMessage(message: Message) Recibe mensajes de texto del cliente y los guarda a disco. Referencias • E. Jendrock et al., “Java EE 6 Tutorial”, Oracle, 2012