Java EE Plattform

Werbung
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
Herunterladen