600 likes | 762 Views
de Tales from TheServerSide.com. Agenda. Los componentes en un desarrollo J2EE. J2EE y los EJBs Historia y evolución Problemática La elección pragmática. EJB 3.0 Evolución de los EJBs Tour por EJB 3.0 Ejemplos. ¿Qu é dirección tomar ?. Conclusiones. Agenda.
E N D
Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs • Historia y evolución • Problemática • La elección pragmática • EJB 3.0 • Evolución de los EJBs • Tour por EJB 3.0 • Ejemplos • ¿Qué dirección tomar? • Conclusiones
Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs • Historia y evolución • Problemática • La elección pragmática • EJB 3.0 • Evolución de los EJBs • Tour por EJB 3.0 • Ejemplos • ¿Qué dirección tomar? • Conclusiones
Componentes J2EE Framework de productividad J2EE Presentación JSP, Strut, JSF, Ajax, Flex, GWT, Swing • Build • Ant • Maven • Eclipse / IDE’s • APT / XDoclets • JUnit • OpenSTA • Log4J • CVS/SVN • … • Infraestructura • Apache • Tomcat • JBoss • Weblogic • Websphere • Oracle AS • AspectJ • … Middleware EJBs (CMP, MDB, Session, …) Hibernate, Kodo, Spring, Jakarta Commons Base de Datos Oracle, DB2, SAP DB, SQL Server, MySQL, HSQLDB, PostgreSQL
Componentes J2EE Framework de productividad J2EE: Build • Sistema de build • Ant sigue siendo imbatible • Maven • IDE • Eclipse y plugins • Intellij IDEA ($), BEA Workshop, NetBeans, JBuilder ($) • Calidad • JUnit (Frameworks XUnit), JMeter, OpenSTA, LoadRunner ($) • CheckStyle, JDepend, PMD • SVN, CVS, ClearCase ($) • Quest JProbe ($), Borland OptimizeIt ($)
Componentes J2EE de Tales from TheServerSide.com • Cliente pesado • Swing • Java Web Start • … Framework de productividad J2EE: Presentación • Framework MVC • Struts, Struts Tiles (documentación, experiencia, …) • Tapestry, JSF, Flex, GWT, Seam, etc: menor experiencia
Componentes J2EE Framework de productividad J2EE: Middleware • Persistencia • EJB, JDO, TopLink, Hibernate, Kodo • Integración de los componentes • Spring, HiveMind,Jakarta Commons • Infraestructura • Weblogic, Webphere, Oracle 9i AS, JBoss, Tomcat • Supervisión de la programación por aspectos (AOP) • Seguridad, auditoria, log • Spring, AspectJ
Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs • Historia y evolución • Problemática • La elección pragmática • EJB 3.0 • Evolución de los EJBs • Tour por EJB 3.0 • Ejemplos • ¿Qué dirección tomar? • Conclusiones
J2EE y los EJBs EIS WEB Business Browser JSP Servlet Entity Beans Session Beans MD Beans Componentes JavaBeans (Opcional) Base de Datos Client Servidor J2EE • Session Beans : conversación, lógica de negocio • Entity Beans : persistencia • Message Driven Beans : Session Bean + JMS
J2EE y los EJBs J2EE != EJB • Los EJB fueron vendidos como la solución a todos los problemas. • Basado más sobre • especificaciones que sobre experiencia (EJB 2.1, 646 páginas) • implementar una arquitectura distribuida que sobre su utilización • Gartner Group afirmó que desde el 2003, se han gastado 2 billones de dólares innecesariamente en application servers • Después de muchos años, fuerte reacción anti-EJB
J2EE y los EJBs Servicios • El application server provee: • Connection pooling • Soporte Transaccional • Thread pooling • Clustering, load balance, high availability • El container EJB provee: • Transacciones declarativas (CMT) • Seguridad declarativa • Business Object pooling!
J2EE y los EJBs EJBs : Los problemas • Es muy ‘engorroso’ • Intrusivo: javax.ejb, interfaces, callback methods • Combinación de checked / unchecked exceptions • JNDI lookups • Chequeo semántico al momento de deploy • Infierno de METADATA XML • Complejo de sincronizar • Faltan defaults útiles • Entity Beans • La implementación local no puede ser devuelta al cliente • No tiene estrategias de mapeo para herencia • No son polimórficos • EJB-QL/finders en la práctica, muy limitante
J2EE y los EJBs EJBLocalObject public interface Customer implements EJBLocalObject { long getId(); setId(long id(; … } Sincronización Mantenimiento EJBLocalHome public interface CustomerHome implements EJBLocalHome { … } EJBObject public interface CustomerRemote implements EJBObject { long getId(); setId(long id(; … } EJBHome public interface CustomerRemoteHome implements EJBHome { … } ejb-jar.xml <ejb-jar> <enterprise-beans> <entity> <ejb-name>Customer</ejb-name> <local-home>CustomerHome</local-home> <local>Customer</local> <ejb-class>CustomerBean</ejb-class> …. Desing Patterns weblogic-rdbms-ejb-jar.xml <weblogic-rdbms-jar> <weblogic-rdbms-bean> <ejb-name>Customer</ejb-name> <data-source-name>java:/dataSource</data-source-name> <table-name>CUSTOMER</table-name> <field-map> <cmp-field>id</cmp-field> <dbms-column>ID</dbms-column>…. ServiceLocator DTO weblogic-ejb-jar.xml <weblogic-enterprise-bean> <ejb-name>Customer</ejb-name> <jndi-name>Customer</jndi-name> </weblogic-enterprise-bean> Bussines Delegate etc … / Generadores EJBs : Los problemas EJB public class CustomerBean extends EntityBean { public abstract long getId(); public abstrac setId(… … … } • Productividad ?? • WORA ?? • Fácil de Testear ?? • Diseño restringido ??
J2EE y los EJBs EJBs desde un punto de vista pragmático: • Stateless Session Beans • Container Managed Transactions(JTA) • Message Driven Beans (MDBs) • Utilización de POJOs (JavaBeans) • Persistencia con framework no EJB (ORM)
J2EE y los EJBs de Tales from TheServerSide.com • Dejan al descubierto los problemas de desarrollar con EJB, y son las premisas de un ‘otro’ modo de desarrollar aplicaciones J2EE Evolución de la plataforma J2EE • Experiencia acumulada en el desarrollo de aplicaciones J2EE • Un conjunto de tecnologías y frameworks, modificados considerablemente resultaron en: • AOP • Hibernate, JDO, … • Framework IoC: Spring, HiveMind, … • TDD
J2EE y los EJBs EJB : Pequeña historia • Marzo 1998: EJB 1.0 • Noviembre 1999: EJB 1.1 • deployment descriptors, seguridad, entity beans,… • Agosto 2001: EJB 2.0 • Local interfaces, relationships, EJB-QL, MDBs… • Noviembre 2003 : EJB 2.1 (JSR-153) • EJB-QL (order by, avg, max, min, sum, count), • EJB Timer service… • Junio 2004: EJB 3.0 Early Draft (JSR-220) • Mayo 2006: EJB 3.0 Final Release (JSR-220)
Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs • Historia y evolución • Problemática • La elección pragmática • EJB 3.0 • Evolución de los EJBs • Tour por EJB 3.0 • Ejemplos • ¿Qué dirección tomar? • Conclusiones
EJB 3.0 de Tales from TheServerSide.com • El objetivo: "evolucionar rápidamente para soportar un gran rango de desarrolladores, incluyendo aquellos menos sofisticados” Horizonte • JSR-175(Java 1.5), anotacionespueden reemplazar deployment descriptors • Compatibilidad ascendente • EJB 2.x no está ‘deprecado’ • Hay un asentimiento de lasfalencias no reconocidas. • Persistencia tipo ORM • Especificacion separada (JPA) • Ventaja para los que ya tengan un producto (JBoss, Weblogic, Oracle) • Sumar al EJB Expert Group gente de JDO.
EJB 3.0 /** *@hibernate.class table="CATS" */ public class Cat { /** * @hibernate.propertycolumn="BIRTH_DATE" */ public Date getBirthdate() { JSR-175 @Session public class IdGeneratorImpl implements IdGenerator @TransactionAttribute(REQUIRES_NEW) public int nextId() @Table(name=“ITEMS”) public class Item { • Se definen en .java (sintaxis similar a una interfaz). • Se acceden por introspección o procesador de anotaciones (apt). • Hay que importarlos para utilizarlos: • import javax.persistence.Session;
EJB 3.0 Session Beans • POJO • Sin interfaz Home, otras interfaces POJI. • Métodos Callbacks opcionales • (@PostConstruct, @PreDestroy, @PostActivate, @PrePassivate) • Interceptors (@Interceptor, @AroundInvoke) • Metadata como anotaciones • Bean type, @Session, @Stateful, @MessageDriven • Transaction attributes, @Transaction • Dependency injection @EJB, @Resource, @PersistenceContext, • Remoteness @Remote, @Local, @WebService (JSR-181) • Remove method para stateful beans @Remove • Rollback @ApplicationException(rollback=true) • Inyección de dependencias
EJB 3.0 Inyección de dependencias • IoC Framework • Inversión del control • Principio de Hollywood – "Don't call me I will call you" • Dependency Injection • Los componentes no poseen más el conocimiento de las dependencias, sino que éstas son ‘inyectadas’. • Tipos de ‘injection’ : • Anotación de variable pública de instancia • Setter Injection
EJB 3.0 Ejemplo de EJB Session + Injection • @Remote • interface IdGenerator { int nextId(); } • @Session • public class IdGeneratorImpl implements IdGenerator { • @Resource(name=“jdbc/PROD_OLTP”) • public Datasource idDatasource; • @TransactionAttribute(REQUIRES_NEW) • public int nextId() { • Connection c = idDatasource.getConnection(); • try { • Statement s = c.createStatement(“select sequence.nextval from dual”); • ResultSet rs = s.executeQuery(); • rs.next(); • return rs.getInt(1); • } • catch (SQLException sqle) { • throw new RuntimeException(sqle); • } • finally { c.close(); } • } • }
EJB 3.0 Ejemplo de EJB Session + Injection @Session @Remote(IdClient.class) public class IdClientImpl implements IdClient { @EJB public IdGenerator idGeneratorBean; private SessionContext ctx; @Resource public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } public void useId() { int id = idGeneratorBean.nextId(); ... } }
EJB 3.0 Entity Beans • POJO • No requieren interfaces / herencias especiales • Se pueden serializar, pueden ser devueltos al cliente • No requieren interface Home • Propiedades Id / Version • Soportan herencia y polimorfismo !!! • O/R Mapping Metadata como anotaciones • Table mappings, @Table, @SecondaryTable • Column mappings, @Column, @JoinColumn • Associations, @ManyToOne, @OneToOne, @OneToMany, @ManyToMany • Inheritance, @Inheritance, @DiscriminatorColumn • Identifier + Version properties, @Id, @Version • etc…
EJB 3.0 Entity Beans • Métodos Callbacks opcionales. • @PrePersist, @PostPersist, @PreRemove, @PostRemove, @PreUpdate, @PostUpdate, @PostLoad • EntityListener (@EntityListener) • @PrePersist, @PostPersist, @PreRemove, @PostRemove, @PreUpdate, @PostUpdate, @PostLoad
EJB 3.0 Ejemplo de Entity Bean @Entity @Table(name=“FACTURAS”) public class Factura { private Long id; private int version; private Date fecha; private Set<ItemFactura>items = new HashSet<ItemFactura>(); … @Column(name=“FECHA”, nullable=false) public Date getFecha() { return fecha; } public void setFecha(Date fecha) { this. fecha = fecha; }
EJB 3.0 Ejemplo de Entity Bean ... @Id @Column(name=“ITEM_ID”) public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Version public int getVersion() { return version; } protected void setVersion(int version) { this.version = version; } ...
EJB 3.0 Ejemplo de Entity Bean @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name=“PRODUCTO_ID”,nullable=false, updatable=false) public Producto getProducto() { return producto; } protected void setProducto(Producto producto) { this.producto = producto; } ...
EJB 3.0 Ejemplo de Entity Bean @OneToMany(cascade=CascadeType.ALL) @Column(name=“FACTURA_ID”, nullable=false, updatable=false) protected Set<ItemFactura> getItems() { return this.items; } protected void setItems(Set<ItemFactura> items) { this.items = items; } ...
EJB 3.0 EntityManager API • Una interfaz “home” genérica (no tipificada) • Tiene asociado un contexto de persistencia • Es utilizado para crear, modificar y borrar entidades • Se pueden asociar entidades obtenidas en otros contextos a un contexto determinado
EJB 3.0 EntityManager API merge() SQL UPDATE merge() SQL INSERT new New Managed Detached persist() SQL INSERT remove() SQL DELETE Contexto Finalizado
EJB 3.0 Ejemplo de utilización de EntityManager @Session public class FacturasImpl implements Facturas { @PersistenceContext(unitName=“myUnit”) privateEntityManager em; public Factura findById(Long id) { return em.find(Factura.class, id); } public Long create(Factura factura) { em.persist(factura); // factura es ahora ‘managed’ return factura.getId(); } }
EJB 3.0 EntityManagerFactory • Interfaz utilizada para obtener EntityManager’s • Se puede obtener mediante: • JNDI lookup • IoC (@PersistenceUnit) • Con la clase javax.persistence.Persistence • EntityManagerFactory emf; • EntityManager em; • emf = Persistence.createEntityManagerFactory(“myUnit”); • em = emf. createEntityManager();
EJB 3.0 Persistencia ‘plugueable’ • Se separó el API de persistencia (javax.persistence) • Se indica la implementación en el persistence.xml • Se podrá utilizar cualquier AS con cualquier implementación de persistencia. <?xml version="1.0" encoding="UTF-8"?> <persistence> <persistence-unit name=“myUnit” transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>jdbc/MyDB</jta-data-source> <class>com.acme.MyClass</class> <properties> <property name="hibernate.max_fetch_depth" value="4"/> </properties> </persistence-unit> </persistence>
EJB 3.0 miAplicacion.ear miAplicacion.war application.xml web.xml miModuloEJB.jar miModulo.jar ejb-jar.xml persistence.xml persistence.xml Deployment Descriptor • Siguen existiendo. • Se pueden reemplazar o combinar con las anotaciones. • Sobreescriben lo indicado en las anotaciones
EJB 3.0 Query API • Son expresadas en EJBQL • Embebidos en el código • Definidos por anotaciones • Query interface • Binding de parámetros • Control de paginación • Provee • Agregación SELECT c.status, avg(c.filledOrderCount), count(c)FROM Customer c GROUP BY c.statusHAVING s.status IN (1, 2) • Proyecciones SELECT new CustomerDetails(c.id, c.status, o.count)FROM Customer • SubSelects SELECT goodCustomer FROM Customer goodCustomer WHERE goodCustomer.balance < (SELECT avg(c.balance) FROM Customer c) • Querys Polimórficas !!! • Native Queries
EJB 3.0 Ejemplo de utilización de Query @Session public class ItemManagerImpl implements ItemManager { … public List findByDescription(String description, int page) { return em.createQuery( “select i from Item i where i.description like :d”) .setParameter(“d”, description) .setMaxResults(50) .setFirstResult(page*50) .listResults(); }
EJB 3.0 En resumen • Una simplificación en comparación con EJB 2.x • El mapeo relacional pasa a ser parte de la especificación • Realmente orientado a objetos • Inserción de las "Best Practices" existentes • Utilización intensiva de anotaciones (JSR175 / JDK5) • Su especificación ya es ‘Final Release’ • Aprobado el 11 de Mayo de 2006. • Ya hay implementaciones productivas. • Separación de la persistencia (JPA)
EJB 3.0 En resumen EJB public class CustomerBean extends EntityBean { public abstract long getId(); public abstrac setId(… … … } EJB @Entity @Table (name=“CUSTOMER”) public class CustomerBean { @Id @Column(name=“CUSTOMER_ID”) public long getId() { return id; } public setId(long i) { id = i; } … … } EJBLocalObject public interface Customer implements EJBLocalObject { long getId(); setId(long id(; … } Sincronización Mantenimiento EJBLocalHome public interface CustomerHome implements EJBLocalHome { … } EJBObject public interface CustomerRemote implements EJBObject { long getId(); setId(long id(; … } EJBHome public interface CustomerRemoteHome implements EJBHome { … } ejb-jar.xml <ejb-jar> <enterprise-beans> <entity> <ejb-name>Customer</ejb-name> <local-home>CustomerHome</local-home> <local>Customer</local> <ejb-class>CustomerBean</ejb-class> …. Desing Patterns weblogic-rdbms-ejb-jar.xml <weblogic-rdbms-jar> <weblogic-rdbms-bean> <ejb-name>Customer</ejb-name> <data-source-name>java:/dataSource</data-source-name> <table-name>CUSTOMER</table-name> <field-map> <cmp-field>id</cmp-field> <dbms-column>ID</dbms-column>…. ServiceLocator DTO weblogic-ejb-jar.xml <weblogic-enterprise-bean> <ejb-name>Customer</ejb-name> <jndi-name>Customer</jndi-name> </weblogic-enterprise-bean> Bussines Delegate etc … / Generadores custom
Agenda • Los componentes en un desarrollo J2EE • J2EE y los EJBs • Historia y evolución • Problemática • La elección pragmática • EJB 3.0 • Evolución de los EJBs • Tour por EJB 3.0 • Ejemplos • ¿Qué dirección tomar? • Conclusiones
¿Qué dirección tomar? Opciones • Utilizar un contenedor EJB 3.0 / J2EE 5 • Utilizar un contenedor EJB 2.0 + JPA • No utilizar un contenedor EJB (Servicios + JPA)
¿Qué dirección tomar? EJB 3.0 / J2EE 5 • Web Services Technologies • Implementing Enterprise Web Services (JSR 109) • Java API for XML-Based Web Services (JAX-WS) 2.0 (JSR 224) • Java API for XML-Based RPC (JAX-RPC) 1.1 (JSR 101) • Java Architecture for XML Binding (JAXB) 2.0 (JSR 222) • SOAP with Attachments API for Java (SAAJ) (JSR 67) • Streaming API for XML (JSR 173) • Web Service Metadata for the Java Platform (JSR 181) • Web Application Technologies • JavaServer Faces 1.2 (JSR 252) • JavaServer Pages 2.1 (JSR 245) • JavaServer Pages Standard Tag Library (JSR 52) • Java Servlet 2.5 (JSR 154) • Enterprise Application Technologies • Common Annotations for the Java Platform (JSR 250) • Enterprise JavaBeans 3.0 (JSR 220) • J2EE Connector Architecture 1.5 (JSR 112) • JavaBeans Activation Framework (JAF) 1.1 (JSR 925) • JavaMail (JSR 919) • Java Data Objects (JDO) (JSR 243) • Java Message Service API (JMS) (JSR 914) • Java Persistence API (JPA) (JSR 220) • Java Transaction API (JTA) (JSR 907) • Management and Security Technologies • J2EE Application Deployment (JSR 88) • J2EE Management (JSR 77) • Java Authorization Contract for Containers (JSR 115)
¿Qué dirección tomar? Sun Java System Application Server Platform Edition 9 Productivo – (J2EE 5) WebLogic Server v10.0 Productivo – (J2EE 5) Oracle Application Server 11 Productivo – (J2EE 5) TmaxSoft JEUS 6 Productivo – (J2EE 5) SAP NetWeaver 7.1 Trial Version - (J2EE 5) Apache Geronimo-2.0-M6-rc1 Productivo – (J2EE 5) GlassFish Application Server Reference Implementation - (J2EE 5) Apusic ApplicationServer (v5.0) (J2EE 5) Application Server 4.2.0 GA Productivo - (EJB 3.0) Implementaciones EJB 3.0 / J2EE 5
¿Qué dirección tomar? EJB 2.0 + JPA • Simplifico la persistencia • Los patterns VO, DTO dejan de ser obligatorios • Modelo de dominio 100% orientado a objetos • Simplificamos el testeo de los objetos de dominio • Sigo utilizando servicios del contenedor (Pooling, JMS, CMT, JTA, Seguridad, Clustering, Availability, Load Balance) • Migración ordenada a EJB 3.0
¿Qué dirección tomar? EJB 3.0 Client Client POJO POJO Bussines Delegate Bussines Delegate POJO Session Bean EJB 2.0 EJB 3.0 annotations POJO EJB 3.0 annotations POJO EJB 3.0 annotations javax.persistence.Query javax.persistence.Query javax.persistence.EntityManager javax.persistence.EntityManager EJB 2.0 + JPA
¿Qué dirección tomar? POJO Session Bean EJB 2.0 EJB 3.0 annotations EJB 2.0 + JPA EJB 3.0 • Cambiar implementación interfaz Session por anotación • Cambiar métodos callback por anotación • Revisar inyección de dependencias • Utilizar algún pattern de tipo ServiceLocator • Utilizar un método de libreria para obtener EntityManager
¿Qué dirección tomar? Session Bean EJB 2.0 POJO EJB 3.0 annotations POJO EJB 2.0 + JPA EJB 3.0 • El session solo es un ‘proxy’ de acceso al servicio • El session es el encargado de inyectar dependencias al POJO • Solo hay que agregar anotaciones al migrar • Puedo testear mi servicio fuera del contenedor
¿Qué dirección tomar? Hibernate 3.2.2 GA OpenJPA 0.9.7 Kodo™ Oracle TopLink 11g Bea Kodo 4.1 Implementaciones JPA
¿Qué dirección tomar? Servicios + JPA • Simplifico la persistencia • Los patterns VO, DTO dejan de ser obligatorios • Modelo de dominio 100% orientado a objetos • Simplificamos el testeo del servicio y los objetos de dominio • Puedo utilizar algun framework liviano de middleware • (Spring, HiveMind, Pico Container, etc) • Migración ordenada a EJB 3.0 cuando fuera necesario
¿Qué dirección tomar? EJB 3.0 Client Client POJO POJO Bussines Delegate Inyección del Servicio Bussines Delegate Inyección del Servicio XML POJO POJO EJB 3.0 annotations POJO EJB 3.0 annotations POJO EJB 3.0 annotations javax.persistence.Query javax.persistence.Query javax.persistence.EntityManager javax.persistence.EntityManager Servicios + JPA