Java Enterprise Edition (Java EE) Eine Einführung © itemis AG Java Enterprise Editon • Java EE platform • API and runtime environment • for developing and running enterprise applications and services • designed to reduce the complexity of enterprise application development, providing • large-scale • a development model • multi-tiered • APIs for standard system services • scalable • runtime environment • reliable • secure • allows developers to concentrate on business and presentation logic • distributed • network applications © itemis AG 2 Distributed Multitiered Applications • Java EE platform uses a distributed multitiered application model for enterprise applications • Application logic is divided into components according to function • Components are grouped in a stack of tiers • Components are potentially installed on various machines • Typically • Presentation: client and web tier • Business tier • Persistent data tier © itemis AG 3 Java EE • Genau genommen: Spezifikation einer Softwarearchitektur für Enterprise JavaAnwendungen von Sun jetzt Oracle • In der Praxis aber auch: Spring, Tomcat, Hibernate • Spezifiziert werden Komponenten und Dienste • Aktuelle Version: JEE 6 • JEE 5/6 vereinfacht die Entwicklung enorm gegenüber J2EE (1.4) aus 2003 • Wesentlicher Unterschied: Menge der zu erstellenden Artefakte (Schnittstellen, Deployment-Deskriptoren, Implementierungsvorschriften für Callback-Methoden) © itemis AG 4 Warum JEE? • Standardisierung • Skalierbarkeit • Interoperabilität © itemis AG 5 Applicationserver • Java-EE-Komponenten erfordern als Laufzeitumgebung eine spezielle Infrastruktur, den Java EE Applicationserver • Dieser Server stellt verschiedene technische Funktionalitäten bereit • Security • Transaktionsmanagement • Namens- und Verzeichnisdienste • Skalierung • Kommunikation zwischen Java-EE-Komponenten • Management der Komponenten über den gesamten Lebenszyklus (inklusive Instanziierung) • Unterstützung für die Installation (Deployment) und den Betrieb von Anwendungen © itemis AG 6 Applicationserver • Open Source Server • Apache Geronimo • JBoss Application Server • GlassFish • ... • Proprietäre Server • IBM WebSphere • Oracle Application Server • Oracle WebLogic Server • SAP NetWeaver Application Server • ... • Alternativen • Spring-Framework • Tomcat WebContainer • ... © itemis AG 7 Wichtige Subspezifikationen • Insgesamt 23 • Die wichtigsten Spezifikationen innerhalb von JEE: • EJB (Enterprise Java Beans) • JMS (Java Message Service) • JTA (Java Transaction API) • JPA (Java Persistence API) • CDI (Context and Dependency Injection) • JNDI (Java Naming and Directory Interface) • JAAS (Java Authentication and Authorization) © itemis AG 8 Applikationsserver © itemis AG 9 Applicationserver • Ein Java-EE-Server wird in diverse logische Komponenten unterteilt: • Web-Container • Laufzeitumgebung für Servlets und JavaServer Pages (JSP) • Bereitstellung von verschiedenen Diensten für Servlets • EJB-Container • Laufzeitumgebung für Enterprise Java Beans • Überwachung des Lebenszyklus von EJBs • Instanzen-Pooling • Bereitstellung von verschiedenen Diensten für EJBs (Namens- und Verzeichnisdienst, Transaktionsdienst, Nachrichtendienstes • Persistenz • JCA-Container (JEE Connector Architecture) • Laufzeitumgebung Anbindung heterogener Fremdarchitekturen © itemis AG 10 Aufbau einer Anwendung • Presentation Tier (Web Tier) • JSF Pages (Java Server Faces) • JSF Backing Beans • Business Tier • Enterprise Beans • JTA (Java Transaction API) • Persistence Tier • Entity Beans • JPA (Java Persistence API) © itemis AG 11 Einordnung der APIs Darstellungsschicht JSF JSP XSL Servlets JMX JNDI Logik & Kommunikation EJB JMS Webservices JTA XML JPA Datenhaltungsschicht … © itemis AG 12 JavaEE-APIs • JavaServer Pages (JSP) • Framework für Webapplikationen • basiert auf aus JSPs generierten Servlets • Java Server Faces (JSF) • Framework für Webapplikationen • Alternative zu JSP • Java Servlet API • Erlaubt die Erweiterung von Servern, deren Protokoll auf Anfragen und Antworten basiert © itemis AG 13 JavaEE-APIs • Java Transaction API (JTA) • Schnittstelle zur standardisierten Kontrolle von Transaktionen • Java Persistence API (JPA) • Schnittstelle zur vereinfachten Zuordnung und Übertragung von JavaObjekten zu Datenbankeinträgen • Java Naming and Directory Interface (JNDI) • Schnittstelle mit der alle Java Klassen auf Namens- und Verzeichnisdienste zugreifen können • über JNDI wird insbesondere der Zugriff auf Java-EE-Komponenten sichergestellt © itemis AG 14 JavaEE-APIs • Java Message Service (JMS) • API zur asynchronen Nachrichtenverarbeitung • Java Connector Architecture (JCA) • dient der transparenten Integration von externen Systemen • Java Management Extensions (JMX) • dient der Verwaltung von Java-EE Komponenten • Webservice, JAAS, JavaMail, StAX, … © itemis AG 15 Deployment einer Anwendung • Deployment als EAR (EnterpriseArchive) |-- META-INF/ |-- application.xml |-- MANIFEST.MF |-- <Library JAR files> |-- <EJB Module JAR files> |-- <Web Module WAR files> |-- <ResourceAdapter RAR files> © itemis AG 16 Aufbau einer Anwendung am Beispiel Schnelldurchlauf von oben nach unten © itemis AG Demoumgebung • Umgebung • Datenbank MySQL • Application Server Glassfish (Referenzimplementierung, besser nicht für produktiven Einsatz) • Datenbank MySQL • XAMPP-Paket: http://www.apachefriends.org/de/xampp.html • XAMPP installieren laut Anleitung • XAMPP Control zum starten/stoppen von MySQL und Apache (für phpMyAdmin) • phpMyAdmin: http://localhost:80/phpmyadmin/ • Benutzer (hier „jee“) mit Datenbank anlegen © itemis AG 18 Demoumgebung • Applicationserver GlassFish • Download • kommerziell: http://www.oracle.com/technetwork/middleware/glassfish/downloads/ • Open Source: https://glassfish.java.net/de/ • Installation • Kurzanleitung: http://www.torsten-horn.de/techdocs/jee-sunglassfish.htm • Doku: http://www.oracle.com/technetwork/middleware/glassfish/documentation/ View Library Installation Guide / Quick Start Guide • Schritte • MySQL JDBC-Treiber installieren (jar in GlassFish-lib-Verzeichnis) • GlassFish starten (siehe JEE- Eclipse) • GlassFish JDBC Connection Pool einrichten • GlassFish JDBC DataSource unter JNDI-Namen einrichten © itemis AG 19 Demoumgebung • JEE-Eclipse • Download: http://www.eclipse.org/downloads/ Eclipse IDE for Java EE • Server in Eclipse einrichten • Servers View New Server GlassFish 3.1.2 • (ggf. vorher Download additional server adapters) • Kontextmenü auf Server • Start, Stop, AdminConsole (i.d.R. localhost:4848) • JEE-Project • New Other ... Web Dynamic Web Project • Target runtime: GlassFish 3.1.2 © itemis AG 20 Java Server Faces (JSF 2.0) Eine Einführung © itemis AG Aufbau einer Anwendung • Presentation Tier (Web Tier) • JSF Pages (Java Server Faces) • JSF Backing Beans © itemis AG 22 Java Server Faces 2.0 Controller • JSF: Framework für Web-Anwendungen in JavaEE • Trennung von Darstellungsschicht und Programmlogik nach MVC-Pattern Facelet XHTML-Template Model Backing Bean POJO getAttr() setAttr(...) action() <html>! <h:body>! <h2>Customer with id! "#{bankingBean.customerId}“! </h2>! <h:inputText value=! "#{bankingBean.name}“/>! <h:commandButton! value="Speichern“! action="#{personFormular.! speichern}"/>! </h:body>! </html>! View © itemis AG 23 Facelets und Backing Beans • Backing Beans (einfache Java-Klassen) • Zugriff auf Daten durch get- und set- Methoden • Aktions-Methoden, die z.B beim Klick auf einen Button ausgeführt werden • JSF lädt diese Beans bei Bedarf automatisch in den Speicher • Facelets • Template-Engine zwischen Backing Beans und Web-Browser • erzeugt Webseiten auf der Grundlage von Vorlagen (Facelets), die mit Daten aus den Beans befüllt werden • Java Klassen enthalten kein HTML, Facelets enthalten kein Java-Code • Trennung von Java-Programmierung von HTML-Entwicklung © itemis AG 24 Facelets • Templates für Webseiten (typischerweise Endung .xhtml) enthalten HTML + Ausdrücke aus der Expression Language + JSF Tags • Expression Language Ausdrücke #{user.name}!#{geld.eingang - geld.ausgang}! #{auto.farbe != rot} • JSF-Tags • Kontrollstrukturen ! ! ! ! ! <ui:fragment rendered="#{user.alter > 12}“>! ! Du bist alt genug! </ui:fragment>! <ui:repeat var="auto" value="#{meinBean.alleAutos}">! ! Das Auto #{auto.name} ist #{auto.farbe}.! </ui:repeat> © itemis AG 25 Facelets • JSF-Tags • HTML-(Formular-)Elemente ! <h:form>! ! ! <h:inputText value="#{personFormular.name}“/>! ! ! <h:commandButton value="Speichern“ ! ! ! ! ! action="#{personFormular.speichern}"/>! ! </h:form> • Bestimmung des Page-Flows • Facelet-Name als Rückgabewert der Aktions-Methoden (ohne Endung.xhtml) ! public String speichern() {! ! ! ... Aufruf Geschäftslogik ...! ! ! return “gespeichert“;! ! }! ruft Facelet gespeichet.xhml auf © itemis AG 26 Zusammenspiel mit Backing Bean © itemis AG 27 Grundkonfiguration • WebContent/WEB-INF/web.xml (sun-web.xml brauchen wir hier nicht) • JSF ist ein Aufsatz auf die Servlet API, d.h. Faces-Servlet konfigurieren <?xml version="1.0" encoding="UTF-8"?>! <web-app xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance! xmlns=http://java.sun.com/xml/ns/javaee! xmlns:web=http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd! xsi:schemaLocation="http://java.sun.com/xml/ns/javaee! http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd” id="WebApp_ID" version="3.0">! <display-name>WebApp Name</display-name>! <welcome-file-list>! <welcome-file>index.xhtml</welcome-file>! </welcome-file-list>! <servlet>! <servlet-name>Faces Servlet</servlet-name>! <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>! <load-on-startup>1</load-on-startup>! </servlet>! <servlet-mapping>! <servlet-name>Faces Servlet</servlet-name>! <url-pattern>*.xhtml</url-pattern>! </servlet-mapping>! </web-app>! © itemis AG 28 Grundkonfiguration • WebContent/WEB-INF/faces-config.xml • Überbleibsel von JSF 1.0 • Konfiguration bei JSF 2.0 weitgehend über Annotationen • d.h. entfällt i.d.R. oder leer <?xml version="1.0" encoding="UTF-8"?>! <faces-config! xmlns="http://java.sun.com/xml/ns/javaee"! xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"! xsi:schemaLocation="http://java.sun.com/xml/ns/javaee ! ! ! ! ! http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"! version="2.0">! </faces-config>! © itemis AG 29 Backing Bean • Annotation @ManagedBean! • automatisch bei Bedarf vom Container instantiiert • unter dem Klassennamen der Template Engine bekannt gemacht • eindeutiger Name für Managed-Beans, egal in welchem Package • optional @ManagedBean(name="person”) • Scoping von Beans, d.h. Definition der Lebensdauer, per Annotation • @ApplicationScoped: genau einmal geladen, solange im Speicher, wie die Applikation läuft • @RequestScoped: für jeden HTTP Request eine neue eigene Instanz • @SessionScoped: in der HTTP-Session abgelegt und wieder verwendet • @ViewScoped: solange, wie Nutzer die aktuelle Seite benutzt © itemis AG 30 Backing Bean package de.skatulla.jee.jsfbeans;! import java.io.Serializable;! import javax.faces.bean.ManagedBean;! import javax.faces.bean.SessionScoped;! @ManagedBean @SessionScoped! public class PersonBean implements Serializable {! ! private static final long serialVersionUID = -5684916245218747993L;! ! private String _name;! ! private String _id;! ! public String getName() {! ! ! return _name;! ! }! ! public void setName(String name) {! ! ! _name = name;! ! }! ! public String getId() {! ! ! return _id;! ! }! ! public void setId(String id) {! ! ! _id = id;! ! }! ! public String save() {! ! ! setId(UUID.randomUUID().toString());! ! ! return "Person";! ! }! }! © itemis AG 31 Facelet <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ! "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">! <html xmlns="http://www.w3.org/1999/xhtml"! xmlns:h="http://java.sun.com/jsf/html"! xmlns:ui="http://java.sun.com/jsf/facelets">! <head>! <title>Person</title>! </head>! <body>! ! <h:form>! ! ! <h1>Person</h1>! ! ! <h:panelGrid border="0" columns="2">! ! ! ! ! ! ! <h:outputText value="ID"/>! <h:outputText value="#{personBean.id}"/>! ! ! ! ! ! ! <h:outputText value="Name"/>! <h:inputText value="#{personBean.name}"/>! ! ! </h:panelGrid>! ! ! <h:commandButton value="Save" action="#{personBean.save}"/>! ! </h:form>! </body>! </html>! © itemis AG 32 Enterprise Java Beans (EJB 3.1) Eine Einführung © itemis AG Aufbau einer Anwendung • Business Tier • Enterprise Beans • JTA (Java Transaction API) © itemis AG 34 EJB – Enterprise Java Bean • Komponente mit Geschäftslogik und/oder Zugriff auf persistente Daten • Ausführung im EJB Container • Seit JEE 5 POJO mit Annotationen • In J2EE 1.4 mit Home-, Remote- und SessionBean-Interface und DeploymentDeskriptor • Zugreifbar über die JNDI-Registry • Unterscheidung: • Stateless Session Bean • Stateful Session Bean • Message Driven Bean © itemis AG 35 Stateless Session Bean • Zwei Status: Non existent und Ready • Callbacks im Lifecycle: @PostConstruct und @PreDestroy • Zustandlos © itemis AG 36 Stateful Session Bean • Eine Instanz pro Client • Status: Non Existent, Ready, Passivated • Callbacks im Lifecycle: @PostConstruct, @PreDestroy, @PrePassivate, @PostActivate • Wird eher selten eingesetzt © itemis AG 37 MessageDrivenBean • Kommunikation über JMS • Nimmt Nachrichten entgegen, für Queues/Topics, auf die sich eine MDB registriert hat © itemis AG 38 Stateless Session Bean • Service IPersonService.save() deklariert durch Interface package de.skatulla.jee.services;! import de.skatulla.jee.jsfbeans.PersonBean;! public interface IPersonService {! ! public abstract void save(PersonBean personBean);! }! • Implementation durch Stateless Session Bean PersonServiceImpl package de.skatulla.jee.services;! import java.util.UUID;! import javax.ejb.Stateless;! import de.skatulla.jee.jsfbeans.PersonBean;! @Stateless! //@TransactionAttribute(TransactionAttributeType.REQUIRED)! public class PersonServiceImpl implements IPersonService {! ! @Override! ! public void save(PersonBean personBean) {! ! ! personBean.setId(UUID.randomUUID().toString());! ! }! ! }! © itemis AG 39 Verwendung des Services • Backing Bean erhält Zugriff auf Service durch Dependency Injection (DI) • keine Abhängigkeit zur Service-Implementation nur zum Interface • keine Instanziierung von Service-Bean • Service-Bean wird vom Container instanziiert und „injiziert“ (dem annotierten Feld zugewiesen) @EJB! private IPersonService personService;! public String save() {! ! personService.save(this);! ! return "Person";! }! • Vorteile von DI • Implementation kann ausgetauscht werden • Separates Deployment • Instanzen-Pooling durch Container © itemis AG 40 Transaktionsmanagement (JTA) • Management der Transaktionen durch den Container • Zwei Möglichkeiten • BeanManaged-Transactions (Steuerung durch den Benutzer) • ContainerManaged-Transactions • Begin-, Commit und Rollback-Steuerung durch Container an den Transaktionsgrenzen (Begin, Commit implizit, Rollback bei System Exception oder manuell mit setRollbackOnly()) • Steuerung durch @TransactionAttribute an (Service-)Bean oder Methoden • Default: REQUIRED: gerufene Methode in selber TA wie aufrufende, wenn TA bereits geöffnet, sonst neue TA öffnen • REQUIRES_NEW: neue (autonome) TA • MANDATORY, NEVER, NOT_SUPPORTED, SUPPORTS! © itemis AG 41 Java Persistence API (JPA 2.0) Eine Einführung © itemis AG Aufbau einer Anwendung • Persistence Tier • Entity Beans • JPA (Java Persistence API) © itemis AG 43 JPA – Java Persistence API • App-Server-Hersteller verwenden meist ihre eigene JPA-Implementation • JBOSS – Hibernate, Oracle – EclipseLink, Glassfish – EclipseLink • Datenhalter sind Entities, einfache POJOs • Eigene Query-Languange JPQL • Mapping über Annotationen oder xml © itemis AG 44 JPA Entities • Datenbankanbindung durch Mapping von einfachen Java-Klassen auf Tabellen • i.d.R. eine Klasse eine Tabelle • Klassen als einfache Beans • Felder mit Settern und Gettern • Mapping Klasse Tabelle • Annotationen • @Entity an Klasse opt.Tabellenname • @Basic (optional) an Spalten • @Id für Schlüssel-Spalte • @Column opt. Spaltenname • alternativ XML-Mappingdefinition @Entity(name=“TABLE_NAME") public class Customer { private String name; @Id public String getName() { return name; } public void setName(String name) { this.name = name; } private String mail; @Column(name="COLUMN") public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } @Basic public String address; public Customer() {} } © itemis AG 45 JPA EntityManager • In einer SessionBean injiziert über @PersistenceContext(unitName=„Name“) • Ist entweder TransactionScoped oder Extended • Managed den Lifecycle einer Entity • javax.persistence.EntityManager • Stellt Methoden für das Finden, Löschen, Einfügen von Daten bereit • persist(Object), find(Class, Id), remove(Object), merge(Object) • Weiterhin Methoden für • Queries (createQuery), NamedQueries (createNamedQuery), NativeQueries(createNativeQuery) © itemis AG 46 JPA Entities • Weitere Mapping-Annotationen für • Spalteneigenschaften • Not Null, Default, Datentyp, Generierung des Wertes, Indexe, ... • Beziehungen • Many-to-One, One-To-One, One-To-Many • Referentielle Itegrität • Ableitungshierarchien bei Entities können definiert werden • verschiedene Abbildungsstrategien auf Tabellen • Hierarchietabelle • horizontal / vertikal partitioniert • Tabelle pro Subtyp • ... © itemis AG 47 JPA Entity package de.skatulla.jee.entities;! import javax.persistence.Column;! import javax.persistence.Entity;! import javax.persistence.Id;! @Entity! public class Person {! private String _name;! private String _id;! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! }! @Column! public String getName() {! ! return _name;! }! public void setName(String name) {! ! _name = name;! }! ! @Id! public String getId() {! ! return _id;! }! public void setId(String id) {! ! _id = id;! }! ! ! © itemis AG 48 JPA-Konfiguration • src/META-INF/persistence.xml <?xml version="1.0" encoding="UTF-8"?>! <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"! ! ! xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"! ! ! xsi:schemaLocation="http://java.sun.com/xml/ns/persistence! http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">! ! ! ! <persistence-unit name="mypersistenceunit">! ! ! <jta-data-source>jdbc/jee-test</jta-data-source>! ! ! <properties>! ! ! ! <!-- EclipseLink should create the database schema automatically -->! ! ! ! <property name="eclipselink.logging.level" value="OFF" />! ! ! ! <property name="eclipselink.ddl-generation" value="create-tables" />! ! ! ! <property name="eclipselink.ddl-generation.output-mode" value="database" />! ! ! </properties>! ! </persistence-unit>! </persistence>! © itemis AG 49 JPA Verwendung in Session Beans • Zugriff auf Entity-Manager • per Dependency Injection • Interface EntityManager! • Annotation @PersistenceContext mit definiertem Namen der Persistence Unit • Entity anlegen • über Entity-Manger speichern package de.skatulla.jee.services;! import ...! @Stateless! public class PersonServiceImpl implements IPersonService {! ! @PersistenceContext(name="mypersistenceunit")! ! private EntityManager entityManager;! ! ! ! ! @Override! ! public void save(PersonBean personBean) {! ! ! personBean.setId(UUID.randomUUID().toString());! ! ! ! ! ! Person person = new Person();! ! ! person.setId(personBean.getId());! ! ! person.setName(personBean.getName());! ! ! entityManager.persist(person);! ! }! ! ! }! © itemis AG 50 JPA Query • getSingleResult() • getResultList() • getFirstResult() • setParameter() • setHint() • excecuteUpdate() © itemis AG 51 JPA Transaktionen • Transaktionsteilnahme erfolgt wie konfiguriert • Resource_Local EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //Operationen auf dem EntityManager em.close(); • JTA • bei CMT voll automatisch (Methoden-Ein- und Austritt) • Bei BMT TransactionManager vom Context holen • TransaktionManager.begin(), commit() und rollback() © itemis AG 52 JPA Query Language • SQL-ähnliche Syntax • Navigation über Objektgraphen • Beispiel select protocol from Protocol protocol where protocol.protocolId.prt_id = :id © itemis AG 53 JPA – Weitere Möglichkeiten • Callbacks an Entities • @PrePersist, @PostPersist, @PreRemove, @PostRemove, @PreUpdate, @PostUpdate, @PreLoad • Vererbungsstrategien • Eine Tabelle pro Klassenhierachie (mit Diskriminator-Feld) • Eine Tabelle pro konkreter Entityklasse • Join-Tabelle mit separaten Tabellen per SubClass und ParentClass • Unterstützung verschiedener Generierungsmechanismen für Ids (z. B. Sequences, UUID) © itemis AG 54 Java EE – Verschiedene Anmerkungen Eine Einführung © itemis AG Wichtige Konzepte • Trennung von API und dessen Implementierung • Spezifikation von Schnittstellen für verschiedenste Komponenten und Aspekte • Einsatz von APIs erleichtert in der Theorie den Austausch der verwendeten Implementierung • Dependency Injection • Beans mit minimalen Abhängigkeiten untereinander • Abhängigkieten nur zum Interface • Wiring von Instanzen von außen • Abhängige Objekte werden von DI-Framework injiziert © itemis AG 56 Wichtige Konzepte • Client-Server-Modell • JavaSE ausgerichtet auf Entwicklung und Betrieb von Java Programmen auf Einzelplatzrechnern / JavaEE für Betrieb auf Servern zur Umsetzung von Diensten gedacht • Client verwendet die bereitgestellten Server-Dienste ◊ Aufteilung auf mehrere VMs (und verschiedene Rechner) / Kommunikation zwischen Client und Server als zusätzlicher Aspekt • Mehrschichtige Anwendungen • Aufteilung von Anwendungen in verschiedene Schichten mit klar getrennten Aufgabenbereichen © itemis AG 57 „Klassische“ JavaEE-Anwendung • Aufteilung der zu erstellenden Komponenten auf die verschiedenen Schichten • Verwendung der spezifizierten und vom Applicationserver bereitgestellten JavaEE Komponenten mit ihren jeweiligen Schnittstellen (APIs) • Externe Ressourcen werden den Anwendungen vom Applicationserver zugänglich gemacht Konfiguration dieser Ressourcen mittels Applicationserver-Schnittstellen • Deployment einzelner Anwendungen in Form von .war und .ear Paketen mit zum Teil Applicationserver spezifischen Konfigurationen • Management und Überwachung von installierten Anwendungen durch Applicationserver © itemis AG 58 JMS • Queues • Point-to-Point • Topics • Publish - Subscribe © itemis AG 59 JMS © itemis AG 60 JMS – Arten von Nachrichten • Message – Nachricht ohne Inhalt (Body) • StreamMessage – Nachricht mit einem Stream von Java-Primitiven • MapMessage – Nachricht mit einer Map von Java-Objekten • TextMessage – Nachricht mit einem String (z. B. für XML-Messages) • ObjectMessage – Nachricht mit einem serialisierten Java Objekt • BytesMessage – Nachricht mit einem Stream von Bytes © itemis AG 61 JMS – Nachrichten versenden • ConnectionFactory erstellen • Connection erstellen • Session erzeugen • Message erzeugen • Message senden • Asynchron • MessageProducer.send(Message) • MessageProducer versendet die Nachricht, ohne auf eine Antwort zu warten • Synchron • QueueRequestor.request(Message) • Request-/Response-Verfahren • MessageProducer.send(Message) und MessageConsumer.receive(timeToWait) • MessageConsumer wartet bestimmte Zeit auf Antwort © itemis AG 62 JMS – Nachrichten empfangen • Entweder MessageDrivenBean, die sich auf eine Queue/Topic registriert hat • oder Thread, der auf eingehende Nachrichten wartet • Implementiert wird javax.jms.MessageListener onMessage(Message) • Consumer (Queue) bzw. Subscriber (Topic) lauscht über den Listener © itemis AG 63 EJBs – Enterprise Java Beans • Gelten als Komponenten einer Anwendung und beinhalten deren Geschäftslogik oder gestatten Zugriff auf persistente Daten • Werden innerhalb eines EJB-Containers ausgeführt • Aufgaben • Kapselung der Geschäftslogik • Transaktionsmanagement • Loadbalancing • Es gibt drei unterschiedliche Typen von EJBs • Session-Beans, sowohl statusbehaftet als auch ohne internen Status, welche die Geschäftslogik implementieren und meistens vom Client zugreifbar sind • Message-Driven-Beans (MDB) für die Verarbeitung von JMS-Nachrichten • Entity-Beans für die Abbildung von persistenten Datenobjekten © itemis AG 64 Probleme von Java EE • Portabilität von JavaEE-Anwendungen auf verschiedene Applicationserver ist durch proprietäre Erweiterungen stark eingeschränkt • durch die hohe Anzahl der APIs ist der Lernaufwand sehr hoch • Theoretisch sollte durch die APIs die Komplexität reduziert werden. Praktisch muss der Entwickler trotzdem oft wissen, was genau hinter der API steckt • J2EE mit EJB2 war sehr umständlich - EJB3 verbessert durch zahlreiche Vereinfachungen • Standardisierte Rahmenbedingungen können als Einschränkungen wirken © itemis AG 65 Ausblick auf die weiteren Veranstaltungen Uni Jena, 2013-05-06 © itemis AG Die nächsten Veranstaltungen mit Gästen 03.06. 8-12 Michael Plöd, Senacor JPA 17.06. 8-10 Ralph Winzinger, Senacor Ein großes MDSD-JavaEE-Projekt 10-12 Christian Zander, Greenpike Scrum-Einführung in einem großen MDSD-JavaEE-Projekt 24.06.* 8-12 Detlef Hornbostel, Ibykus Ein alternativer MDSD-Ansatz 01.07.* 8-12 Alexander Nittka, itemis Modellierung von Verhalten – Algorithmen in Modellen * evtl. Termine vertauscht © itemis AG 67