JAVA EE PLATTFORM CAS Enterprise Application Development Java EE Simon Martinelli, 10.2013 [email protected] | about.me/simas_ch INHALT 1. 2. 3. 4. ÜBERBLICK PRINZIPIEN UND PATTERNS CONTAINER SERVICES TECHNOLOGIEN 2 1 ÜBERBLICK 3 1 ÜBERBLICK VON DER APPLIKATION ZUR PLATTFORM Applikation Applikation Framework Infrastruktur Code Library Applikation Java EE Plattform Web Container EJB Container Komponenten Komponenten Dienste Quelle: Stephan Fischli 4 1 ÜBERBLICK PLATTFORM Komponente Komponente Komponente Komponente Komponente Container Dienste Anwendungsorientierte Middleware / Java EE Plattform Kommunikationsinfrastruktur Betriebssystem / Verteiltes System Quelle: Pearson 5 1 ÜBERBLICK CONTAINER, DIENSTE UND KOMPONENTEN Java EE Plattform enthält stellt zur Verfügung Container Dienst läuft in verwendet Komponente Quelle: Stephan Fischli 6 1 ÜBERBLICK GESCHICHTE Quelle: Oracle 7 1 ÜBERBLICK JAVA EE 7 Quelle: Oracle 8 1 ÜBERBLICK SPEZIFIKATIONEN Quelle: blog.eisele.net 9 1 ÜBERBLICK SCHICHTEN Quelle: Oracle 10 1 ÜBERBLICK CONTAINER Quelle: Oracle 11 1 ÜBERBLICK APIS Quelle: Oracle 12 2 PRINZIPIEN/PATTERNS 1.INJECTION UND FACTORY 2.KONTEXT 3.PROXY 4.INTERCEPTORS 13 2 PRINZIPIEN/PATTERNS DEPENDENCY INJECTION Don’t Call Us – We Call You! Quelle: Martin Fowler, 2004 http://martinfowler.com/articles/injection.html 14 2 PRINZIPIEN/PATTERNS BACKGROUND The question is, what aspect of control are [they] inverting? • Martin Fowler stellte diese Frage über Inversion of Control (IoC) 2004 auf seiner Website • Fowler machte den Vorschlag, das Prinzip in Dependency Injection umzubennen, damit es selbsterklärend ist 15 2 PRINZIPIEN/PATTERNS EIN NAIVER ANSATZ 16 2 PRINZIPIEN/PATTERNS TRADIONELLE METHODE private MovieFinder finder; public MovieLister() { finder = new ColonDelimitedMovieFinder("movies1.txt"); } • Probleme • Starke Kopplung • Nicht besonders änderungsfreundlich 17 2 PRINZIPIEN/PATTERNS FACTORY PATTERNS Å Abstract Factory Factory Method Æ 18 2 PRINZIPIEN/PATTERNS LÖSUNG: FACTORY METHOD public class MoveFinderFactory() { public static MovieFinder createMovieFinder(String f) { return new ColonDelimitedMovieFinder(f); } } • Probleme • Unnötiger Code • Problem in die Factory verschoben • Wie wird die Factory konfiguriert? 19 2 PRINZIPIEN/PATTERNS LÖSUNG: SERVICE LOCATOR 20 2 PRINZIPIEN/PATTERNS LÖSUNG: DEPENDENCY INJECTION • Don’t call us - we call you! (Hollywood Prinzip) • Inversion of Control • Beziehungen werden von aussen gesetzt • Constructor • Setter • Annotations • Frameworks • Java EE • Spring • Google Guice 21 2 PRINZIPIEN/PATTERNS ASSEMBLER 22 2 PRINZIPIEN/PATTERNS METADATEN • Annotationen • Ab Java 5 • Complier geprüft • Business Code “Verschmutzung” • XML • Kein Recompile bei Änderungen • Fehleranfällig 23 2 PRINZIPIEN/PATTERNS KONTEXT Der Lebenszyklus und die Interaktionen von zustandsbehafteten Komponenten werden an wohldefinierte aber erweiterbare Kontexte gebunden Request Conversation Session Application 24 2 PRINZIPIEN/PATTERNS VERWALTUNG VON SCOPES • Der Scope gibt einem Objekt ein wohldefinierten Lifecycle Kontext • Ein Objekt wird bei der ersten Verwendung automatisch erzeugt • Das Objekt wird automatisch zerstört, wenn der Kontext endet 26 2 PRINZIPIEN/PATTERNS PROXY 27 Bildquelle: Wikipedia 2 PRINZIPIEN/PATTERNS PROXY SZENARIOS • Virtual Proxy Imagine a situation where there is multiple database call to extract huge size image. Since this is an expensive operation we can possibly use the proxy pattern which would create multiple proxies and point to the huge size memory consuming object for further processing. The real object gets created only when a client first requests/accesses the object and after that we can just refer to the proxy to reuse the object. This avoids duplication of the object and hence saving memory. • Remote Proxy A remote proxy can be thought about the stub in the RPC call. The remote proxy provides a local representation of the object which is present in the different address location. Another example can be providing interface for remote resources such as web service or REST resources. Quelle: idiotechie.com/gang-of-four-proxy-design-pattern/ 29 2 PRINZIPIEN/PATTERNS PROXY SZENARIOS • Protective Proxy The protective proxy acts as an authorization layer to verify if the actual user has access to appropriate content. An example can be thought about the proxy server which provides restrictive internet access in office. Only the websites and contents which are valid will be allowed and the remaining ones will be blocked. • Smart Proxy A smart proxy provides additional layer of security by interposing specific actions when the object is accessed. An example can be to check if the real object is locked before it is accessed to ensure that no other object can change it. Quelle: idiotechie.com/gang-of-four-proxy-design-pattern/ 30 2 PRINZIPIEN/PATTERNS AOP • Aspektorientierte Programmierung (AOP) ist ein Programmierparadigma, um generische Funktionalitäten über mehrere Klassen hinweg zu verwenden Æ Cross-Cutting Concerns • Logische Aspekte eines Anwendungsprogramms werden dabei von der eigentlichen Geschäftslogik getrennt • Typische Anwendungsbeispiele sind Transaktionsverwaltung, Auditfähigkeit und Logging • Das Konzept von AOP wurde von Gregor Kiczales und seinem Team bei der Firma Xerox PARC entwickelt • Im Jahr 2001 wurde dort auch die erste AOPSprache AspectJ vorgestellt 31 2 PRINZIPIEN/PATTERNS INTERCEPTOR 32 3 CONTAINER SERVICES 1. NAMING 6. PERSISTENZ 2. TRANSAKTIONEN 7. ASYNCHRONITÄT 3. SECURITY 8. MESSAGING 4. REMOTING 9. CONCURRENCY 5. POOLING 10. VALIDIERUNG 34 3 CONTAINER SERVICES NAMING • Das Java Naming and Directory Interface (JNDI) erlaubt es Komponenten, andere Komponenten und Ressourcen zu lokalisieren • Eine Ressource ist ein Objekt, das eine Verbindung zu Systemen wie Datenbanken oder Messaging erlaubt • Jede Komponente und jede Ressource wird durch einen eindeutigen JNDI Namen identifiziert /jndi/name Komponente Ressource 35 3 CONTAINER SERVICES BEISPIEL JNDI BAUM +- ProShopEar (class: org.jnp.interfaces.NamingContext) | +- DayssaleService (class: org.jnp.interfaces.NamingContext) | | +- no-interface (class: com.prodega.proshop.service.DayssaleService_$$_javassist_98) | +- BasketDao (class: org.jnp.interfaces.NamingContext) | | | +- OfferDao (class: org.jnp.interfaces.NamingContext) | | | +- ParameterDao (class: org.jnp.interfaces.NamingContext) | | | +- DeprecationService (class: org.jnp.interfaces.NamingContext) | | +- remote-com.prodega.proshop.service.DeprecationServiceRemote | | +- no-interface (class: com.prodega.proshop.service.DeprecationService_$$_javassist_86) | | +- remote (class: Proxy for: com.prodega.proshop.service.DeprecationServiceRemote) +- no-interface (class: com.prodega.proshop.dao.BasketDao_$$_javassist_39) +- no-interface (class: com.prodega.proshop.dao.OfferDao_$$_javassist_67) +- no-interface (class: com.prodega.proshop.dao.ParameterDao_$$_javassist_64) 36 3 CONTAINER SERVICES RESOURCE VS DEPENDECY Injection Mechanism Resource Injection Dependency Injection Can Inject JNDI Resources Directly Yes Can Inject Regular Classes Directly Resolves By Type Safe No Resource name No No Yes Type Yes 37 3 CONTAINER SERVICES TRANSAKTIONEN begin transaction debit checking account credit savings account update history log commit transaction • Aus logischer Sicht ist eine Transaktion ein Arbeitspaket, das einen geschäftlichen Nutzen erzeugt • Sie sollte so klein wie möglich aber so gross wie nötig sein, um alle Integritätsbedingungen einhalten zu können • Aus technischer Sicht ist eine Transaktion eine Folge von Leseund/oder Änderungsoperationen in der Datenbank oder einem anderen System, mit einem definierten Beginn und einem definierten Abschluss 38 3 CONTAINER SERVICES TWO PHASE COMMIT (2PC) • Von X/Open standardisiertes Verfahren • Der Koordinator holt sich in der ersten Phase die Zustimmung oder Ablehnung aller beteiligten Prozesse ein • Wenn alle Teilnehmer zustimmen, wird ein Commit sonst ein Rollback eingeleitet • Ist die Entscheidung gefallen, unterrichtet der Koordinator in der zweiten Phase die Teilnehmer über das Ergebnis • Gemäss diesem Ergebnis wird entweder die gesamte Transaktion zurückgesetzt, oder alle Teiltransaktionen werden zum erfolgreichen Ende geführt Quelle: coding time - martin konicek 39 3 CONTAINER SERVICES SECURITY 1) 4) 2) 5) 3) 40 3 CONTAINER SERVICES JAVA EE SECURITY • Wird durch den Container bereitgestellt • Unterstützt Authentifizierung und Autorisierung • Kann deklarativ @RolesAllowed("BASKET") public EmptyDTO deleteBasket(Basket basket) • oder imperativ verwendet werden sessionContext.isCallerInRole("BASKET"); • Hinweis: Keine Autorisierung auf Datenebene 41 3 CONTAINER SERVICES REMOTING • Enterprise Java Beans (EJB) mit Remote Interface können über EJB Remoting aufgerufen werden System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); System.setProperty(Context.PROVIDER_URL, "localhost:1099"); Context ctx = new InitialContext(); checkoutService = (CheckoutServiceRemote) ctx.lookup("ProShopEar/CheckoutService/remote"); • Web Services • HTTP(S) • Java EE kennt zwei Typen von Web Services • SOAP • REST 42 3 CONTAINER SERVICES POOLING 43 3 CONTAINER SERVICES PERSISTENZ Applikation JPA Provider (EclipseLink, Hibernate etc.) JDBC API (Datenbank-unabhängig) JDBC Treiber (Datenbank-abhängig) Datenbank 45 3 CONTAINER SERVICES ASYNCHRONITÄT • EJB Methodenaufrufe @Asynchronous public Future<String> processPayment(Order order) { ... return new AsyncResult<String>(status); } • TimerService @Schedule(dayOfWeek="Sun", hour="0") public void cleanupWeekData() { ... } 47 3 CONTAINER SERVICES MESSAGING Å Point to Point Publish / Subscribe Æ Quelle: Java EE 7 Tutorial, Oracle 48 3 CONTAINER SERVICES MESSAGING • Message Passing ist ein Kommunikationsmodell zum asynchronen Transport von Daten zwischen Prozessen • Die Daten werden innerhalb von Nachrichten (Messages) übertragen • Messaging Systeme kennen zwei Modelle • Point to Point • Publish / Subscribe • Java Message Service (JMS) ist die standardisierte Schnittstelle für den Zugriff auf Messaging Systeme 49 3 CONTAINER SERVICES BATCH • Enterprise Applikationen beinhalten häufig Tasks, die ohne Userinteraktion ablaufen können • Diese Tasks werden meist periodisch ausgeführt und verarbeiten grosse Datenmengen und/oder benötigen viele Systemressourcen • Diese Tasks werden als Batch Jobs bezeichnet • Das steuern der Batch Jobs ist die Aufgabe eines Batchverarbeitungssystem • Java EE 7 stellt ein Batchverarbeitungs-Framework zur Verfügung • Die Batch Jobs werden mittels Job Specification Language (JSL) konfiguriert 50 3 CONTAINER SERVICES BATCH JobOperator jobOperator = BatchRuntime.getJobOperator(); jobOperator.start("simplejob", props); Quelle: Java EE 7 Tutorial, Oracle 51 3 CONTAINER SERVICES JSL <job id="loganalysis" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0"> <properties> <property name="input_file" value="input1.txt"/> <property name="output_file" value="output2.txt"/> </properties> <step id="logprocessor" next="cleanup"> <chunk checkpoint-policy="item" item-count="10"> <reader ref="com.xyz.pkg.LogItemReader" /> <processor ref="com.xyz.pkg.LogItemProcessor" /> <writer ref="com.xyz.pkg.LogItemWriter" /> </chunk> </step> <step id="cleanup"> <batchlet ref="com.xyz.pkg.CleanUp" /> <end on="COMPLETED"/> </step> </job> 52 3 CONTAINER SERVICES CONCURRENCY • Concurrent Ressourcen sind Objekte, die Parallelität in Java EE-Anwendungen ermöglichen • Diese werden im Application Server konfiguriert und sind dann für Anwendungskomponenten wie Servlets und EJBs verfügbar • Die Ressourcen sind über JNDI Lookup oder Injection zugreifbar • Die primären Komponenten sind • ManagedExecutorService • ManagedScheduledExecutorService 53 3 CONTAINER SERVICES VALIDIERUNG 54 3 CONTAINER SERVICES DEKLARATION • Database Schema create table Document ( id bigint not null primary key, title varchar(30) not null, summary varchar(255), content varchar(255) ) • Business Code if (document.getTitle() == null || document.getTitle().length() > 30) { throw new BusinessException(“Document title invalid”); } • Presentation Level if (documentForm.getTitle() == null || documentForm.getTitle().length() > 30) { FacesContext.getCurrentInstance().addMessage(“ERROR”, new FacesMessage(“Document title invalid“)); } 55 3 CONTAINER SERVICES PROBLEME • Duplizierung • Mehrfache Deklaration der gleichen Bedingung • Doppelter Code • Risiko der Inkonsistenz • Überprüfung zur Laufzeit • Nicht alle Bedingungen können überall geprüft werden • Unterschiedliche Semantik 56 3 CONTAINER SERVICES LÖSUNG • Einheitliche Form • Eine Sprache für alle • Basierend auf dem Domain Modell (JavaBeans) • Einheitliche Validierung • Ein Framework • Eine Implementierung • Brücke zu anderen Technologien • API, um auf Bedingungen zuzugreifen 57 4 TECHNOLOGIEN 1.CDI 2.BEAN VALIDATION 3.JTA 4.JCA 58 4 TECHNOLOGIEN CDI Contexts and Dependency Injection for Java EE (CDI) Ursprünglicher Name der Spezifikation: WebBeans Inspiriert durch Seam Framework CDI ist ein Set vom Diensten, die verwendet werden können, um die Verwendung von JavaServer Faces und Enterprise JavaBeans einfacher zu machen • CDI ist zustandsbehaftet und hilft, typsicher loose gekoppelte Komponenten zu erstellen • • • • 59 4 TECHNOLOGIEN JAVA EE DI Enterprise JavaBeans 3.1 JSR-318 Contexts and Dependency Injection for the Java EE platform JSR-299 Dependency Injection for Java JSR-330 60 4 TECHNOLOGIEN CDI INJECTION Die Bean public class MyService { } public class AnotherService { @Inject private MyService myService; Der Injection Point Könnte auch ein Konstruktor oder Setter sein } 61 4 TECHNOLOGIEN QUALIFIERS ZweiImplementations Implementationenof Two desselben the same Interfaces interface @Asynchronous public class AsyncService implements MyService { ... } public class AnotherService { @Synchronous public class SyncService implements MyService { ... } Injection muss qualifiziert werden @Inject @Synchronous private MyService myService; } 62 4 TECHNOLOGIEN PRODUCERS public class MyService { public MyService(A a) { // ... } } public class MyServiceProducer { Producer Methoden um Instanzen zu erzeugen A wird injeziert! @Produces public MyService createMyService(A a) { return new MyService(a); } } public class AnotherService { @Inject private MyService myService; } 63 4 TECHNOLOGIEN INTERCEPTORS Der Interceptor @Interceptor @Transactional public class TransactionInterceptor { @AroundInvoke public Object manageTransaction(InvocationContext ctx) { // ... } } Die Annotation @InterceptorBinding public @interface Transactional { } public class MyService { @Transactional public void foo() { // ... } } A Transactional Method 64 4 TECHNOLOGIEN EVENTS public class MyService { @Inject private Event<LoggedInEvent> loggedInEvent; Das Event Objekt public void login(String username, String password) { loggedInEvent.fire(new LoggedInEvent(username)); // ... } } Event feuern public class LoggedInObserver { public void afterLogin(@Observers LoggedInEvent event) { // ... Der Listener } } Wird synchron aufgerufen! 65 4 TECHNOLOGIEN ASYNCHRONOUS EVENTS @Stateless public class LoggedInObserver { } @Asynchronous public void afterLogin(@Observers LoggedInEvent event) { // ... } Der Listener als EJB Wird asynchron aufgerufen! 66 4 TECHNOLOGIEN CDI EXTENSIONS Quelle: http://planet.jboss.org/post/seam_next_announcement 67 4 TECHNOLOGIEN BEAN VALIDATION public class Employee { @NotNull private Integer id; @NotNull @Size(min=1, max=32) private String name; } 68 4 TECHNOLOGIEN DESIGN BY CONTRACT public class Greeter { public String greet(@NotNull String name) { return "Hello " + name; } } 69 4 TECHNOLOGIEN BUILT-IN CONSTRAINTS • @AssertFalse • @AssertTrue • @DecimalMax • @DecimalMin • @Digits • @Future • @Past • @Max • @Min • @NotNull • @Null • @Pattern • @Size 70 1 ÜBERBLICK API validiert erzeugt ValidatorFactory Validator meldet Constraint fasst zusammen übersetzt MessageInterpolator ConstraintViolation Group 71 4 TECHNOLOGIEN VALIDIERUNG AUSFÜHREN • JSF und JPA integrieren Bean Validation • Bean Validation kann aber auch «von Hand» aufgerufen werden ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Car car = new Car(null); Set<ConstraintViolation<Car>> cvs = validator.validate(car); 72 4 TECHNOLOGIEN EIGENE BEDINGUNGEN Es gibt zwei Möglichkeiten, eigene Bedingungen zu erstellen 1. Durch Komposition bestehender Bedingungen @NotNull @Size(min = 2, max = 14) public @interface ValidateLicensePlate 2. Implementieren einer eigenen Bedingung Annotation @Constraint(validatedBy = CheckCaseValidator.class) Implementation public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> { public void initialize(CheckCase constraintAnnotation) public boolean isValid(String object, ConstraintValidatorContext constraintContext) 73 4 TECHNOLOGIEN VALIDATION MESSAGES • Bean Validation beinhaltet Übersetzungen für die built-in Constraints • Im Default Package der Applikation können die Meldungen in der Datei ValidationMessages.properties abgelegt werden • Lokale Varianten können wie gewohnt mit dem Locale Suffix versehen werden • z.B. für Deutsch ValidationMessages_de.properties 74 4 TECHNOLOGIEN GRUPPIERUNG • Bedingungen können einer oder mehreren Gruppen zugeordnet werden • Gruppen werden verwendet, um nur eine Untermenge der Bedingungen zu prüfen • Ist nichts definiert, gehört die Bedingung zur Gruppe Default • Die Gruppierung kann bei der Deklaration angegeben werden @NotNull(groups={ First.class }) Phone workPhone; 75 4 TECHNOLOGIEN JTA • Die Java Transaction API (JTA) ist das Standard Java API, um mit Transaktionen zu arbeiten • JTA definiert das UserTransaction Interface, welches Applikationen erlaubt, Transaktionen zu starten, zu committen oder ein Rollback zu machen • Applikationen können auf die UserTransaction via JNDI java:comp/UserTransaction oder mittels Injection zugreifen 76 4 TECHNOLOGIEN JAVA CONNECTOR ARCHITECTURE 77