• Komplexität durch Verteilung • Komplexität Heterogenität

Werbung
Abbildung 1 - Einleitung
Komplexität heutiger Firmenumgebung




Komplexität durch Verteilung
o
echte Parallelität
o
fehleranfällige Kommunikation
o
Ausfälle von Rechner und Netzwerk
Komplexität durch Anwendungen
und Benutzer
o
Anwendungsklassen (z.B. Email /
Komplexität Heterogenität
o
OS
o
HW Architekturen
o
Programmiersprachen
Workflow Anwendungen)
o
o
Bildungshintergrund)

Komplexität durch gesetzliche
Auflagen
100 verschiedene Anwendungen
z
Unterschiedliche Benutzergruppen
(z.B. Sprache, Arbeitsweise,
Komplexität durch Menge
o
Sehr grosses Spektrum von
"
"
2
Lösungsstrategien

Homogenes System
(man vereinheitlicht die Umgebung, man migriert alles für diese Umgebung.
Programmiersprache Hardware, Netwerkprotokolle sind vorgeben.)
o
Problem: Technischer Fortschritt -> dauernde Migration
o
one-fits-all
z
z
/wenige Hersteller erreichbar
o

, offene Systeme
(man lebt mit der Heterogenität und bringt die
Teilsysteme zur Interoperation)
-
o
o
z
z
Komplexe Heteroene Systeme müssen in Kleinprobleme unterteilt werden, um sie lösen zu können
(Divide et Impera)
Strukturierung von Heterogenen Systemen

Strukt. nach Abstraktionszweck
o

Zachmann Framework (top-down
Strukt. nach Anforderung
o
Ansatz)
o
Strukturierung nach
Konstruktivistischer Ansatz (bottomup Ansatz)

Abstraktionsgrad/Rollen und
Strukt. nach Architektur-Schichten
o
Aspekten (Wer, Wie, Was, ...).
Performance: jede Abstraktionsebene
kostet
o
In SW Entwicklung bekannt ist 3 Tier
o
und Logik auf Klienten Maschine)
Gut:-> gute Skalierbarkeit, offline
Betriebt möglich, Schlecht: ->
Wartung verteilt.
o
Client / Server Arch.
o
auf Klienten) Gut: -> Braucht nur
Darstellungsengine
Transparenz in einem Heterogenen System
Location Transparency, Access Transparency, Migration Transparency, Replication Transparency, Resource
Transparency, Transaction Transparency, Security Transparency
Abbildung 2 - Middleware
Was ist Middleware?





Die Schnittstelle zwischen
Client/Server
Das, für was niemand bezahlen
möchte
Unterstützt die Applikation, damit
sie sich auf die Businesslogik
konsentrieren kann. (Boden der
OSI Schicht 7)
Schafft eine Abstraktion zu den
Topologien der benutzten
Ressourcen.


Im weitesten Sinn: Umfasst
Komponenten und Dienste,
welche die AnwendungsKomponenten zusammen halten.
Im engeren Sinn: Sind vor allem
die Kommunikationsorientierten
Funktionen gemeint.
EA benötigt als Fundament immer
Middleware
Objektorientierte Kooperation


Methoden Aufruf macht Request,
Callback Methode liefert Response
Request und Response entspricht
einem Methoden Aufruf (opt. Ack)
Entkopplung der Lebensräume

Fall 1: Objekt und
Subjekt leben im
gleichen Lebensraum
o

Fall 2: Objekt und Subjekt leben in zwei
verschiedenen Lebensräumen
o
Remote Method Invocation (RMI)
Static, dynamic Binding

Server muss existieren

Client muss wissen wo das Server Objekt
ist

Client besitzt ein Proxy-Objekt

Methodenaufruf wird verpackt und über
das Netz geschickt
o
Message Queuing

Protokoll wird über Message erledigt

Hilft bei asynchronen Entitäten
Abbildung 3 - RMI
RMI (Remote Method Invocation) vs. Klassisch Remote Procedure Call (RPC)






Klassischer RPC mit C
„
“
vorhanden
grosse Variantenvielfalt
RMI mit Java
Light RPC
Homogen da mit Java, aber
heterogen wegen dem
Abstraktionslayer von Java
RMI
Es müssen auch allfällige Exception auf den Client
in der RMI Registry wird der Server registriert. Der Client
übertragen werden!
fragt in der Registry nach dem gewünschten Service und
erhält darauf hin ein Proxy-Objekt, welches er benutzen
kann wie wenn das Objekt auf dem Server auf dem
Client befindet (Proxy übergibt die Kommandos an das
Objekt auf dem Server, ohne dass wir etwas davon
bemerken).
Details RPC


RPC steht über dem TCP

Über dem RPC steht die Library XDR external
durch includes (Client und Server erhalten
Data Representation (gemeinsam mit dem RPC ist
includes, die sie benutzen müssen, die über
dies die Middleware)
rpcgen generiert werden. Bei RMI heisst das


XDR ist Library die den Bitstream formen kann:
Tool: rmic


o
Zeichendarstellung
o
Byte und Bit-Ordnung
o
Ausrichtung auf Wortgrenze
ruft Client wieder an, wenn er seine Arbeit
o
Darstellen von Fliesskommowerten (Big-
gemacht hat) im Prinzip 2 RPC mit
Short Endian)
vertauschter Rolle
Als Marshalling wird die Übertragung von

Strukturen als Bitmuster bezeichnet.


Einheitliche Kommunikation wird sichergestellt
Es gibt synchrone und asynchrone RPCs.
Es gibt auch Callback Möglichkeiten (Server
RPC Protocol:
o
Request: Transaction Identifier
Korrekte Identifizierung eines Service durch:
(XID), Version Number, Program
ProgramNr. + ProgramVersion + ProcedureNr.
Nr.-ProgVersion-ProcedureNr,
Kann höchstens ein Aufrufparameter
Argument Data
(Übergabeparameter) und ein Return
Parameter besitzen.
o

Response: XID, Outcome
Potmapper/rpcbind: Programm registriert
Dienste, Client sucht Dienste auf Server bei
Portmapper, Client sendet Request an Server
und erhält Response.
Probleme mit RPC

Ausfall des Servers zum falschen Zeitpunkt

Ausfall des Clients

Multi-Threading

Kein Response heisst für den Client entweder:
o

o
o
At least once: request wird so oft
wiederholt bis response eintrifft. (benötigt
Timeout beim client)
Absturz vor oder nach der Ausführung
o
Orphans (Remote Operation verwaist):
o

Fehlerbehebung:

At most once. Client sendet request
genau 2 mal. Repsonse werden ignoriert.
Client erhält möglicherweise nach Neustart
o
Exactly once: Client sendet den Request
die Antwort eines alten Requests.
so viel mal bis Repsonse eintritt. Server
Unklarer Zustand zwischen Client und
muss seine Sendungen protokollieren und
Server
allenfalls nochmals senden (rechnet aber
Lösung von Orphans
nicht nochmals die Anfrage)
o
Client protokolliert offene Requests
o
Orphans bei Server nach Neustart löschen

Jedoch: Hoher
Protokollierungsaufwand

Braucht gezieltes Rollback
einzelner Orphans.
Abbildung 4 – CORBA
Common Object Request Broker Architecture
Entwickelt durch die OMG (Object
Managment Group)
Ziel:
ORB Core ist der Dienst der aus
diesem Gremium hervor ging.
 Enthält Verzeichnisdienste (Publizieren,
Suchen, Finden)

Absolute Transparenz (Ort, Platform etc.)
IDL Interface Definition Language

Wie beim RPC, basis für Server / Client, damit Platformunabhänige Request / Reponse versendet werden
können.

Die Sprache ist CORBA spezifisch

Objektorientiert

Wie bei rpcgen wird konkret Code aus der IDL für eine CORBA Implementation generiert.

Pro IDL File können mehrere Interfaces deklariert werden.

Ü

Verschachtelungen sind möglich
„ y
“
Client / Server Struktur

Client sieht Server als Objekt Übergabeparameter sind Objekte.(Eine Library bildet die internen Datentypen
auf CORBA taugliche Datentypen ab)

Server muss sich als Server anmelden. Konkrete Methode wird dann vom Framework bei Bedarf aufgerufen.
Schwierigkeiten mit Legacy Systemen (fremd Systemen)

Man benötigt für die Systeme eine CORBA-Umgebung
o
Einfacher Fall: Applikation lässt sich BOA / POA tauglich machen.
o
Normal Fall: Applikation benötigt einen Adapter
o
Schwieriger Fall: Der ORB-Standard muss vorgegaukelt werden, kann aber nicht direkt
implementiert werden.
Dienste von CORBA


Object Services
o
Event Distribution (Weiterleitung von asynchronen Ereignissen)
o
Naming (Abbilden von Namen aufn Objekte, lokalisieren von Objekten)
o
Lifecycle (Management des Object, erzeugen, löschen, verlagern etc.)
o
Persitence
o
Security
Common Facilities (höherwertige Dienste)
o
Horizontal Common Facilities (printing, task mangament etc.)
o
Vertical Common Facilities (Basisfunktion für diverse Marktsegmente)
Weiterentwicklungen von CORBA

AMI (Asnychronous Method Invocation)
o

Hat einen Callback, der aber nicht auf dem Client ausgeführt werden muss.
Object by Value anstatt Object by Reference
Abbildung 5 – JDNI & RMI über CORBA
JDNI (Java Naming and Directory Interface)

Namen und Objekte sind
aneinander gebunden

Es kann nach Objekten über
Namen gesucht werden (lookup)

Ein Context ist eine Sammlung
von Binings (Namen, an Objekte
gebunden sind)

Ein JDNI Context muss über eine
Factory erstellet werden. (Context
Factories).
RMI über CORBA
Damit RMI via CORBA funktioniert muss nur der Server in einen JDNI Context
verpackt werden (vorher war es die RMI Registry) und via das Tool rmic mit der
Option –iiop die entsprechenden Headerfiles generiert werden. Ansonsten beleibt alles
gleich wie beim alten RMI
Abbildung 6 – TCP
TCP Grundlagen

Beliebte Basis für Protokolle mit verteilten Objekt

Unterstützt Flusskontrolle

Werden in Java als Sockets implementiert
Sockets:

Im Socket-Konstruktor wird die
Verbindungsaufnahme versucht

getInputStream, getOutpuStream liefert
Anschlusspunkte für Datenaustausch.
TCP mit HTTP / HTTPS
HTTP:
HTTPS:

Browser sendet Request

Übertragungskanal ist kryptisch gesichert

Server antwortet mit einer HTML-Seite (kann

Server kann/muss seine Identität gesichert
auch an ein Servlet geleitet werden um
dynamischen Inhalt zu erzeugen)

offen legen.

Eigentlich auch nur ein RPC
Server kann vom Client ebenfalls eine
Authentifizierung verlangen
Ablauf SSL Setup
Client Authentifizierung

HTTP-Autehntifizierung
o
Benutzer gibt UserID und Passwort

SSL-Authentifizierung
o
an
o
o
Kann über diverse
Es wird z.B. in Tomcat ein Connector
konfiguriert
o
Clientseitige Authentifizierung ist an
Authentifizierungsdienste erfolgen
die Verbindung gebunden. (Logisch
Kann Browser Fenster sein, darf aber
da SSL-Authentifzierung)
auch ein HTML-Formular sein (Jeh
o
Nur Angaben aus dem Zertifikat
nach Einstellungen im Application-
können beim Request herausgelesen
Server)
werden. Eine Autehntifizierung kann
aber nicht mehr explizit verlangt
werden.
Abbildung 7 – Webservice
Webservice Grundlagen

Plattformunabhängig

Sprachunabhängig

Offene Spezifikation

Basiert auf XML

Gehört zum Boden des Layer 6 im OSI Model

Werden über URLs adressiert

Man greift meist via http/soap darauf zu.

Dienste und Interfaces sind ausführlich mit
Metadaten beschreibbar.

Anbieter und Konsument können die
Spezifikation bilateral übergeben es gibt aber
auch Register (UDDI).

(Rege Einschub) Problem: Verzeichnisdienst
UDDI ist komplex! Es Fehlt ein einfacher Dienst

Verkörpert SOA (Service Oriented Architecture)
SOAP Simple Object Access Protocol

Ein lightweight RPC Protokoll

Verpackt und beschreibt den Inhalt

SOAP Header ist fakultativ:
o
(envelope)



Enthält AuthentifizierungsMechanismen.
Kann Inhalte für jeden Anwendungs-Datentype
o
Transaktions-Support
ausdrücken enocding)
o
mustUnderstand Attribute (damit
Definiert Request und Response (auch Sematik)
kann ein Service gewisse schwierige
(rpc)
Sachen ignorieren und doch seinen
Sagt wie http für SOAP benutzt werden muss
Dienst erfüllen)
(http-rulse)
o
actor-Attribut (benötigt um Request
weiterzugeben)
Webserivce in Java


Funktionieren mit Session Beans und POJOS
@WebMethode gekennzeichnet. Bean mit
(JavaBeans)

Teil des SDK ab Java 6

Server ist der Endpoint, Client hat einen
Endpoint-Proxy
Jede Methode für den Webservice wird mit
@WebService

TranascationAttribute funktionieren hier
ebenfalls (Siehe EJB, Transaktion Attribute)

WSDL generieren mittels: wsimport -d . DIRECOTRY -p PACKAGE WEBSERVICE

Service hollt man via Instanzierung der
NAMENService Klasse, eigentliches Interface für
den Aufruf via NAMENPort
WSDL Webservice Description Language

Darin steht was ein Client über den Webservice wissen muss

Kann als Implementations Spezifikation für einen Service dienen.

Kann nach der Implementation generiert werden.

Kann vom Client gebraucht werden um die Webservice Implementation zu generieren (z.B. mit WSDL2Java).

UDDI (Universal Description, Discovery and Integration

Wird von einem Drittanbieter als Registry

betrieben


Customer können ihren Service suchen wie bei
einer Suchmaschine.
REST
des Webservices werden publiziert und
Service Provider können da ihre Dienste
publizieren
Essentielle Informationen für das Verwenden
gewartet.

Ist nicht nur auf Webservices beschränkt

Die Ressourcen sind alle per URI ansprechbar

Die HTML-Operationen machen jeweils den Transfer

Operationen verursachen keine Zustandsänderung

Ist sehr einfach (siehe Beispiel)

SOAP hat aber die grössere Verbreitung
JMS Java Message Service

Objekte sind Akteure (es gibt keine Service bei
Administered Objects:
Message Service, es gibt nur Clients)
Werden über das JMS Interface gehandelt

Destinations (Zielort .z.B. Queue)

Es werden zwei administered Objects benötigt

Connection Factory

Hat einen Transaktion-Context (alles oder nicht

bzw. exactly one)
Abbildung 9 – JSF (Java Server Faces)
Kleine Abbildungen, um was es eigentlich geht



Managed Beans (JSF)
Session Beans (EJB)
Entity Beans (EJB)
Servlets

Equivalent zu CGI

Dynamische Webseiten werden in JavaKlassen generiert

HTML-Code (kann aber auch anderer Code
sein) wird in Java-Code erzeugt

Programmierer muss HTML und Java können
public class NewServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("HTMLCODE");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
doGet(request, response);
}
JSP (Java Servlet Pages)

Weiterentwicklung von Servlets

bestehen aus HTML Dateien mit JSP-Tags

Bessere Trennung zwischen Geschäftslogik
und Design als bei Servlets. Java-Logik
teilweise aber immer noch in HTML

Der Designer muss nur JSP Tags können

Der Programmierer braucht kein HTML zu
können

Vergleichbar mit ASP

Ist eine Sicht-Technology (oder Skriptsprache)
mit Template einem Mechanismus um
HTML/CSS/JS zu schreiben
JSF (Java Server Faces)
<html> <head>
<title>JSP-Beispiel</title> </head>
<body>
<%@ page import = "java.util.*" %> <%
if (request.getParameter("submit") != null) {
out.println("Ihre Eingabe: " +
request.getParameter("eingabe") + "<BR>");
out.println("<hr>");
out.println("Aktuelles Systemzeit: "new Date());
} else { %>
<H2>Titel</H2>
<form method="post" action="NewJSP.jsp">
<input type=text name="eingabe" size=30>
<input type=reset name="reset" value="Löschen">
<input type=submit name="submit" value="Abschicken">
</form>
<%}//end if %>
</body>
</html>

Das JSF Framework besteht aus / es macht folgendes:

Serverseitiges Komponenten Framework

Basiert auf dem MVC-Konzept
o
Sollen die Entwicklung vereinfachen

API und Tag Library für Validation, Event
o
Anwendung wird innerhalb eines gewissen Rahmens
Handling etc.

Vergleichbar mit ASP.Net
implementiert
o
Hollywood Prinzip (Framework ruft Programmteile auf)
o
Inversion of Control (Framework steuert Programablauf)
o
Einfachere Internationalisierung und Validierung
o
Benutzt das JavaBeans Konzept
JSF Features

Einfache Aufteilung zwischen Designer und
Programierer

Framework ist leicht erweiterbar

Benutzt JavaBeans

Deklarative Konfiguration

Eventhandling & Navigation-Konfiguration
Elemente einer JSF Appliaktion

Faces-config.xml (bei 1.0 eher gross)
o
Konfiguration von JSF
o
Ab JSF 2 auch mit Annotations
o
Zuständig für ManagedBeans,
Sprachen (in Application) und
Navigationsregeln (Navigation-
<faces-config version="1.2"
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_1_2.xsd">
<managed-bean>
<managed-bean-name>bewertungController</managed-bean-name>
<managed-bean-class>ch.zhaw.BCont </managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Rules)
o
ManagedBeanScope: Session,
Request (Aufruf der Seite),
Application (so lange die Applikation
lebt)
<navigation-rule>
...Siehe Navigation Rules
</navigation-rule>
<application>
<locale-config>
<default-locale>de</default-locale>
<supported-locale>en</supported-locale>
</locale-config>
<resource-bundle>
<base-name>ch.zhaw.ea.dozentenBewertung.messages
</base-name>
<var>msg</var>
</resource-bundle>
</application>
</faces-config>
Oder ManagedBean über Annotations:
@ManagedBean
@SessionScoped(name=“otherName“)


web.xml (eher klein)
JSF XHTML Dateien
o
Oftmals gebraucht bei JSP
o
werden vom Browser aufgerufen (View beim MVC)
o
Startseite, Session-Timeout und
o
enthalten XHTML Code mit JSF Tags
Sicherheitseinstellungen entahlten
o
zu Griff auf Controller (ManagedBean) für Daten (ändern,
abfragen etc)


Controller: Java Klasse (ManagedBean)
Model: Java Klasse (Session und Entity Bean)
o
Wird von der View aufgerufen
o
Sind normale und keine JSF spezifische Beans (EJB).
o
Führt Methoden auf dem Model aus
o
Können auch von einem andren GUI aufgerufen werden
etc.
o
Können mit Annotations versehen werden z.B. JPA (= Entity
Beans)
Java Beans

damit sie genau funktionieren (plus Serialisiert
public class MyBean
{
String name;
public void setName(String name){ this.name=name;}
public String getName(){ return name; }
}
sein)
public boolean isConnected(){}
Sind eine wiederbenutzbare
Softwarekomponente


Brauchen Getter und Setter für jedes Attribut
Jede Getter und Setter Methode muss public
sein.

ODER public boolean getConnected(){}
Boolean kann auch anstatt get is verwenden
UEL (Unified Expression Language) und JSF Komponenten
Ermöglicht dynamisches Verbinden zwischen View,
Beispiel: #{bean.property}
Komponenten und Model
Beispiel 2:

UEL steht in den JSF Seiten
<h:commandButton ...

UEL erlaubt Zugriff auf ein Bean bzw. dessen Inhalt


Value und Method Expression in UEL

v
=“#{
}“ = Aufruf Getter Setter der
Variable

=“#{
!=
} = Prüfen ob die
Bedingung zutrifft, True oder False wird als Wert für
v
=“#{
multipliziert)
JSF Tags
* x}“ = Algebra (Variable wird
style="#{grid.displayed ? ’display:inline;’ :
’display:none;’}”= Verkürzte If Anweisung



rendered genommen

action="#{bean.do}"/>

value=“#{listBean[5]}“ = Array Zugriff
value=“Hello user #{user.username}“ = UEL im
String
action=“#{user.storeUser} = Method Expression
(Aufruf wenn der Methode falls z.B. die Aktion
eintritt)
value=“#{mapBean[’user.username’]}“ = Value
Expression können auch geschachtelt werden
JSF Tag
<h:column>
<h:commandButton>
<h:commandLink>
<h:dataTable>
<h:form>
<h:graphicImage>
<h:inputHidden>
<h:inputSecret>
<h:inputText>
<h:inputTextarea>
<h:message>
<h:messages>
<h:outputFormat>
<h:outputLabel>
<h:outputLink>
<h:outputText>
<h:panelGrid>
<h:panelGroup>
<h:selectBooleanCheckbox>
<h:selectManyCheckbox>
<h:selectManyListbox>
<h:selectManyMenu>
<h:selectOneListbox>
<h:selectOneMenu>
<h:selectOneRadio>
<f:view>
HTML Tag
Beschreibung
<input type="submit">
<a href>
<table>
<form>
<img>
<input type="hidden">
<input type="password">
<input type="text">
<textarea>
<span>
<a>
<table>
<input type="checkbox">
Liste von <input
type="checkbox">
Liste von <select>
<select>
<select>
<select>
Liste von <input type="radio">
Unter Element von View
<f:subview>
<f:attribute>
<f:param>
<f:facet>
<f:actionListener>
<f:setPropertyActionListener>
<f:valueChangeListener>
<f:phaseListener>
<f:validator>
<f:loadBundle>
<f:convertDateTime>
<f:convertNumber>
<f:converter>
<f:selectItem>
<f:selectItems>
<f:validateLength>
<f.validateDoubleRange>
<f:validateLongRange>
<f:verbatim>
Dynamische Navigation (Konfiguration im Facesconfic.xml)
<navigation-rule>
<from-view-id>/logon.jsp</from-view-id>
<navigation-case>
<from-action>#{LogonForm.logon}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/storefront.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{LogonForm.logon}</from-action>
<from-outcome>failure</from-outcome>
<to-view-id>/logon.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Je nach dem was die MethodExpression einer Action (z.B. bei
einem Formular) zurückgibt wird die entsprechende Seite geladen.
Oberstes Element. JSF-Tags
müssen immer innerhalb von
einer View sein.
Lädt Ressource Bundle
Gibt Inhalt als Plaintext
aus.
Statische Navigation (muss aber trotzdem in Faces-confix.xml
eingetragen werden)
<h:commandButton ... action="/page-b.xhtml"/>
<h:commandButton ... action="#{bean.save}"/>
Die Methode bean.save steuert Folge-View statisch oder mit Rule
<h:commandLink ... action="#{bean.save}"/>
Event Handling
ValueChangeEvent = Wenn z.B. ein Dropdownbox den Wert ändert
Action Events = Beim Absenden eines Formulares oder Link
Phase Events = Vor und nach dem Durchlaufen des Lifecycles
Mehrsprachigkeit
Wird durch message Files realisiert Default
message.properties. Für Länderspezifische wird der 2
Ziffer Ländercode verwendet z.B. de oder falls
genauer (z.B. Dialekt) de_CH
Konfiguration Beispiel siehe Faces-confix.xml
Konverter
Eigener Konverter
Beispiel:
public static class MyConverter implements Converter{
<f:convertDateTime pattern="dd-mm-yyyy" />
public Object getAsObject(){...}
public void setAsObject(){...}
}
Eintragen in faces-confix.xml
Validierung
<converter>
<converter-for-class>java.util.Date
</converter-for-class>
<converter-class>xxx.MyDateConverter
</converter-class>
</converter>
Eigene Validatoren
Beispiel:
public class yesNoValidate implements Validator{
<h:inputText value=“#{backingBean.wert}“>
public void validate(Facescontext context,
UIComponent component,
Object value)
throws ValidatorException{
<f:validateDoubleRange minimum="0.0"
maximum="1.0"/>
...
throw new ValidatorException
(new FacesMessage(messageText,null);
</h:inputText>
}
Eintragen in faces-confix.xml
<validator> <validator-id> logischer Name des
Validators </validator-id> <validatorclass>xxx.yesNoValidate</validator-class>
</validator>
Kommunikation zwischen JSF Komponenten via Maps
FacesContext fc =
FacesContext.getCurrentInstance();
fc.getExternalContext().getSessionMap().
put("username",username); //Schreiben
String username = (String)
Kommunikation zwischen JSF Komponenten via Bean
FacesContext fcxt =
FacesContext.getCurrentInstance();
LoginController lc = (loginController)
fcxt.getApplication().createValueBinding
("#{loginController}").getValue(fcxt);
lc.getUsername()
-- enthält Benutzername
fc.getExternalContext().getSessionMap().
get("username");
//Lesen
Kommunikation zwischen JSF Komponenten via Scope
..value=“{sessionScope['username']}“ // Lesen und
Schreiben
Es gibt auch requestScope und applicationScope
Abbildung10 - Ant Log4j, CVS, JUnit
Log4J
Anforderung bei einem Grossbetrieb





Meldungen müssen nach Wichtigkeit klassifiziert
werden (INFO, DEBUG, WARN, ERROR, FATAL)
Logs müssen gespeichert werden / arhciviert werden
Dezentrale Logs müssen zusammengeführt werden
Log Ausgabe: Stanart. und anpassbar
Umleitung zur Laufzeit muss möglich sein
Log4j basiert auf 3 Klassen
 Logger (mit Funktionen: getLogger(class),
Log4J und Logger von Java (ab Version 1.4) als Logging
Frameworks vorhanden.
Logger haben eine Hierarchie gemäss Package
 GetRootLogger liefert den ersten Logger

getRootLogger(), log(msg), warn(msg) etc.)
Appender (bestimmt Ausgabemedium z.B.
ConsoleAppender, FileAppender)
Layout (Bestimmt Ausgabeformat)



Layout:
 SimpleLayout: Einfache Ausgabe
 Patternlayout: Ausgabe wird spezifiziert
%c Logger, %c{2 } last 2 partial names
%C Class name (full agony), %C{2 } last 2 partial names
%d{dd MMM yyyy HH:MM:ss } Date, format see
java.text.SimpleDateFormat
%F File name
%l Location (caution: compiler-option-dependently)
%L Line number
%m user-defined message
%M Method name
%p Level
%r Milliseconds since program start
%t Threadname
%x, %X see Doku
%% individual percentage sign
Appenders:
 Common Appenders (Console-, File-, Rolling- wechsel


Pros
GetLogger(class) liefert immer die gleiche Instanz der
entsp. Namen
Vererbung von Einstellungen an tiefere Hierarchien
Log4.properties (Einstellungen)
 Auch via XML-Struktur möglich log4.xml
 Setzte Appender zu entsprechenden Log-Levels und
bei einer gewissen Grösse, DailyRolling-Appender
wechsel ab einer gewissen Zeit
Network Appenders (Socket, SocketHub, JMS,
NTEventLog.Appender)
Third Party (JDBC-,SNMPTrap-Appender)

wiederum zu entsprechenden Loggern
Bei XML gibt es min und max Level Filter
Cons
log4j is auf Geschwindigkeit getrimmt; zusätzlicher Aufwand fürs Loggen
ist klein
■ log4j ist basierend auf einer Logger Hierarchie
■ log4j kann in Multithreaded Umgebung eingesetzt werden
■ log4j erlaubt es das Ausgabeformat zu wählen
■ log4j erlaubt die Einstellungen zur Laufzeit und via Konfigurationsdatei
■ log4j kann auf verschiedene Ausgabeströme (Datei, Netzwerk, Console)
umgeleitet werden, sogar
mehrere gleichzeitig
■ log4j erlaubt es eine Strategie für den Umgang mit grossen Datenmengen
zu definieren
■
log4j unterstützt keine Mehrsprachigkeit
log4j verwendet selber intern Threads, was je nach Umgebung (z.B. JEE)
problematisch sein kann.
■ log4j muss separat installiert werden (nicht Teil des JDKs)
■ log4j existiert in mehreren Versionen
■
■
ANT (Alternative für grössere Projekte ist MAVEN)
ANT: Übersetztungsschritte in einem Script -> Imperativ

Gesteuert durch eine XML Datei

Datei heisst meisst build.xml

Wurzel der Struktur ist project (mit Namen des
Projektes, basedir und default Target)

Starten mit dem Befehl ant
MAVEN: Es wird die Struktur der Projekte beschrieben (POM) ->
deklarativ
Elemente in den build.xml
 TARGET: Beschreibt Ziele die erreicht werden, Target
Einige andere ANT Befehle


besteht aus mehreren Tasks (kleine Befehle), Targets
können Abhängigkeiten haben (Attribut depends),
übliche Targets run, deploy, build, clean, compile, jar,
test, javadoc, init
TASK: Ist ein kleiner Befehle z.B. <mkdir dir="" />
oder delete <delete dir="" />, ein Task kann
Parameter haben z.B. einen Verzeichnisnamen
Property: Variable die gesetzt werden kann, besteht
aus Namen und Value, benutzt im Target bzw. Task
via ${name}
Kompilieren, Ausführen, Test
Javac = Compiler, Java = Ausführen, Jar =
Paketieren
<javac destdir="${myclass}" classpathref="path">
<java classpath="${class.dir}"
classname="Hello" />
<java classpath="${class.dir}" jar="Test.jar"
fork="true" />
Long Version:
<javac
destdir="${build.classes.dir}">
<include name="**/*.java" />
<classpath = "xyz.jar" />
<copy file = "myfile.txt" tofile="mycopy.txt" />
<copy file = "myfile.txt" todir="dir/copyto" />
<delete file="lib/ant.jar" />
<delete dir="temp" />
<move file = "file.orig" tofile = "file.moved" />
<move file = "file.orig" toDir = "dir/moveto" />
<mkdir dir="${build.dir}/temp>
<touch file="myfile"/>
<get src="http://myser/my.zip" dest="baslibs.jar" />
<echo message="Hello world"/>
<cvs cvsRoot="" package="ant" dest=""/>
Grössere Strukturen:
<copy todir="${build.dir}" >
<fileset dir="${src.dir}">
<include name="**/*.java" />
<exclude name="test/**/*" />
</fileset>
</copy>
<ant
antfile="subproject/subbuild.xml">
<property name="param1" value="version 1.x"/>
</ant>
<exec executable="idlj">
<arg line="-fall"/>
<arg line="-td ${generated.dir}"/>
<arg line="${idl.src.dir/Account.idl"/>
</exec>
<src path="${src.main.dir}" />
<src path="${src.prevayler.dir}" />
<src path="${src.ant.dir}" />
<exclude name="test/** />
</javac>
<jar destfile="${build}/HelloWorld.jar"
basedir="${build}"
includes="*.class">
<manifest>
<attribute name=""MAIN-CLASS"
value="HelloWorld" />
</manifest>
</jar>
<junit>
<classpath refid="classpath.test" />
<formatter type="brief" usefile="false" />
<test name="TestExample" />
</junit>
<zip
destfile="${ant.project.name}-classes.jar">
<include name="${java.classes.dir}/**"/>
</zip
Schreiben eigener Tasks





Erben von der Klasse Task
Enthält Methode execute
Für jeden Member muss ein Set geschrieben werden
Dekleration im Ant-File via taskdef (attribut name,
classname, classpath)
Aufruf im Ant File wie gewohnt
Tipps vom Meister:
1.
2.
3.
4.
5.
6.
Falls Task nicht vorhanden im Internet suchen
Eigene Task schreiben
Property in separate Property Dateia uslagern
Modularisieren der Build Files (generelle Aufgaben in externen
Datei)
Generierung von ANT-Dateien z.B. via XSLT
Ab einer gewissen Grösse auf Maven wechseln
CVS (Concurrent Versions System)
Problemstellung: Kleinere Änderungen im Programm führen
zu unerwarteten Auswirkungen auf andere Programmteile
(oftmals erst später entdeckt)
Frage: Was wurde von Wem Geändert?
Lösung:

Regelmäßiges Zwischenspeichern

Änderungen sind nachvollziehbar

Probleme: Suchen nach Fehler schwierig falls Projekt
gross, Arbeit mit mehreren Entwickler -> wer hat die
Änderung gemacht.
Funktionsweise CVS:

Alle Versionen im Repository abgelegt

Speichert Unterschiede zwischen 2 Dateien

Jüngste (bzw. häufigste Verwendete) Datei wird ganz
gespeichert

Repository kann Lokal oder auf dem Server liegen
CVS Befehle:

init (Anlegen eines Repositorys)

import (ganze Verzeichnisstrukturen importieren)¨

checkout (kopiert Dateien vom Repsoitroy)

commit (Lokale Änderungen auf dem Repository
übernehmen) -> Datei Erhält Versionsnummer
o
Option -m für Kommentar ist
empfehlenswert

add (Hinzufügen einer neuen Datei/Verzeichnis ins
Repository)
Produkte:

MS Visual Source Safe
o
CHeck-In/Check-Out
o
Locks
o
IDE Integration
o
SCC-Interface

CVS
o
Keine Locks
o
Merge/Conflict Resolution
o
Zeigt ganzen Versionsverlauf eines Projektes auf
o
Open Source
o
Implementierung für verschiedene BS
o
IDE Integration
o
Basiert auf dem Filesystem (gleiche Struktur auf
Client und Server) -> Struktur wird überwacht
o
SVN gilt als Nachfolger (DB-basiserend, Commit
atomar auf ganze Projekte, besserer Umgang mit
Binärdaten)
Repository

Besteht aus Verzeichnissen und Dateien in denen
Versionsverlauf gespeichert

Dateien im Repository dürfen nicht mit den BS-Befehle
(delete, mkdir) verändert werden

Regelmäßiges Backup erforderlich

Lokal wird der Ort in die Systemvariable CVSHOME
gespeichert
CVS Befehle:

update (Letzte Änderung aus dem Repository übernehmen)
-> ACHTUNG kann zu einem Konflikt führen, der muss
dann gemerged werden.

Diff (Zeigt Unterschied zweier Dateien an)

tag (Damit das ganze Projekt versioniert wird muss ein Tag
gemacht werden, Dateien werden nur einzeln versioniert.
Jede Version (muss nicht die Neuste) einer Datei weiss
dann zu welchem Tag (z.B: Release Beta) es gehört)
JUnit
Verschiedene Testformen:






White- oder Black-Box Test (mit oder ohne Quelle)
Unit Test: Teile werden in kontrollierter, "künstlicher"
Umgebung getestet
Integration Test: Das Zusammenspiel der Teile wird
getestet
System Test: das Gesamtsystem wird getestet
Regressions Test: Wiederholung der Tests nach
Änderung
Stress Test: Verhalten unter Belastung wird getestet
JUnit 3.8

Test Klasse muss von TestCase erben

Test Methode muss mit test beginnen

Assertion auf richtiges Resultat

Konstruktur ruft den Konstruktor der basisKlasse mit
Grundsätze:

Richtige Resultate müssen vor dem Test bestimmt werden

Neuer Testdurchlauf / Änderung

Test-Resultat müssen protokolliert und analysiert werden

Durchführung von Tests muss automatisch sein
JUnit:



Einfach Test schreiben und ausführen
Einfache Darstellung gut = grün, falsch = rot
Unterstützung bei der Testresultatüberprüfung
Befehle:
assertEquals(T expected, T actual);
assertEquals(double expected, double actual,
double delta);
assertNull(Object object);



dem Namen des Testes auf
setUp (optional) Initialisierung des Testes
tearDown (optional) Aufräumarbeiten durchführen
Ausführung via CMD, ANT oder intgriert in IDE
assertNotNull(Object object);
assertTrue(boolean condition);
fail(String message);
TestRunner.run(TestClass.class) // Test ausführen
TestSuite:

Tests z.B. eines Package werden zusammen gefasst
TestRunner().run(suite());
JUnit 4
+ JUnit 4 = JUnit 3
+ Zwang mit Java 5.0 zu arbeiten
+ Annotationen ( @Test et. al)
+ Neue Paketstruktur ( org.junit )
+ Timeout-Tests
+ Erwartete Exceptions
+ Ignorierbare Testfälle
+ Testfall-Parametrisierung
+ Klassenweite Isolationsklammern
+ assertEquals(Object[] expected, Object[] actual)
- Unterscheidung Failure / Error
- AWT/Swing TestRunner
Abbildung 11 - EJB
Grundlagen (Komponenten und Behälter)
Motivation EJB:
1. Schritt: Kapseln des Codes mit klaren
Schnittstellen
2. Aufteilung nach Tier-Rolle (Darstellung, Logik,
Persistenz)
3. Abtrennung von geteilten Diensten (Trennung
fachlich und technischer Bestandteilen) -> App
Client Container, App Container, Persistency.
Vermischung von funktionaller und technischen
Anforderungen führt zu:
a. Code-Tangling (Durcheinander) =>
mehrere Aspekte in einer gleichen
Klasse
b. Code-Scattering (Streuung) => ein
Aspekt über mehrere Klassen verteilt
Eigenschaften von Aspekten(technischen Anforderungen)

Concern => Anfoderung an die Funktionalität einer App

Core Level Concern => Hauptanforderung an eine
Komponente

Cross Cutting / System Level Concerns
o
haben mehrfaches Auftretten in verschiedenen
Objekten
o
senken Verständlichkeit
o
behindern Wiederverwendung von Objekten
o
sind schwer kapselbar

Typische Stelle im Programmfluss, wo Aspkete ansetzten
(Joint Points):
o
vor, nach Aufruf von Methoden
o
vor, nach dem Setzten von Feldern
o
bei der Instanzierung von Objekten, Erzeugen
einer KLasse
o
im Fehlerfall

Advise: Code des Aspekts, der bei Erreichen des Joint
Points ausgeführt wird

Lösungen in Java:
o
Spring Framwork
o
EJB3
Komponenten:

Interagieren über definierte Schnittstelle

Ist eine abgeschlossene Funkionseinheit

Leben in einer Laufzeitumgebung

Werden leicht zu grössen Funktionseinheiten gruppiert ->
Aggregation

Keine vordefinierte Granularität (Einteilung wie viele
Klassen)

Softwaremodul ist auf Binärcodeebene wiederverwendbar

Sind konfigurierbar

Können einzeln Verteilt werden

Komponentn implementieren meist keine
Infrastrukturdienste sondern beziehen sie aus ihrer
Einsatzumgebung (Ausnahme Infrastrukturdienste)
Komponenten Behälter:

Ist die Laufzeitumgebung der Komponenten

Ist für den Lebenszyklus der Komponenten
verantwortlich

Ist für technische Aspekte der Komponente
verantwortlich

Behälter bietet Dienste an, die die Komponente
benutzen kann.

Behälter können in Behälter integriert sein und
schirmen so die Komponente vom äusseren Behälter
ab

Beispiel:
o
JavaBeans = Komponente, J2SE =
Behälter
Vorteile des gewählten Ansatzes

Mehrschichtenarchitektur (Austausch einzelner Schichten)
 Speration of Concerms (technische Aspekte sind separiert) > Konsentration auf Fachlogik
 Modularisierung
 Standardisierung (meist Teillösungen von 3 Anbieter)
 ACTHUNG: implizite, enge Kopplung zwischen Behälter und
Komponente.
o
EJB = Komponente, EJB Container =
Behälter
Enterprise Beans
EJB Komponente und ihren Container:

Sind Komponenten die Anwendungslogik enthalten

Laufen in einem EJB Container z.B. Glassfish oder
Tomcat (Verantwortlich für Threads, System
Ressourcen, Netzwerverbindungen, DB, APIs etc.)

Implementiert zwei Arten von Schnistellen fachlich
und technisch (so dass die EJB vom Container
verwaltet werden kann)

EJB Container ist Standardisiert, darf jedoch "Valueadd-Features" implementieren

Können via Dependency Injection geladen werden
(@EJB)
DataSources

Sind die persistente Datenspeicherung

Kann eine DB sein

Sollte in verteilte Transaktionen eingebunden werden
(2 Phase Commit = 2PC)

Können auch Enterprise Information Systems (EIS)
sein z.B. SAP
Container-Bean Interaktion

Abfangen (Interception) -> EJB Container Isoliert EJB
vom Client. Container macht Transaktionen, Sicherheit vor
und nach jedem Aufruf

Über Container-Schnittstelle (Aufruf) -> Beans rufen
Methoden des Containers auf um Service benutzen

Über Bean-Schnittstelle (Rückruf) -> Beans können
aufgerufen werden (Callback) über definierte Interfaces,
oder Annotation versehene Methoden der Beans

Inversion of Control (IOC) bzw. in EJB Dependency
Injection
EJB Client - Bean Interaktion

Client ruft EJB auf

Aufruf wird von Container kontrolliert

Client findet EJB mittels JNDI

Client kann EJB über ORB (Object Request Broker z.B.
RMI oder CORBA) -> Zugriff auch übers Netzwerk

EJB kann andere EJB aufrufen (ist dann ebenfalls Client)
3 Arten von Beans

Session Beans (Enthält Geschäftslogik, ist statefull
(SLSB) oder stateless (SFSB))
Repräsentiert ein Prozess, Verhalten oder Ablauf
Greift auf andere Beans zu
hat einen Leeren konstruktor
wird oft direkt vom Client lokal/entfernt aufgerufen via
JNDI-Lookup
(Server fängt Anfrage des Clients via dem Lookup ab
und gibt eine Bean Instanz aus dem Pool zurück, oder
erstell falls keine Verfügbar eine neue. Beim Beenden
wird die Instanz zurück in den Pool gestellt)
o Callbacks werden bei Zustandswechsel aufgerufen
o Kann (optional) Teil einer Trans. sein
Entity Bean (Repräsentiert den Zustand =
Geschäftsobjekte)
o Bildet eine Datenquelle auf eine Klasse ab
o muss einen eindeutigen Schlüssel haben
o kommt nur einmal im System vor
o EJB3 Entity Bean = JPA Manged Object
o Überlebt die Verbindungszeit und sogar die Container
Lebenszeit
o Kann nicht direkt vom Client angesprochen werden
(nur über Session Beans via EntityManager)
o Immer Teil einer Transaktion
Message-Driven Bean (Zugriff auf asynchrone
Schnittstelle JMS)
o Entspricht einem Stateless SessionBean
o Agieren als Listener von Meldungs Brokern
o Kann auch als Vermittler zwischen zwei Systemen /
Komponenten dienen
o Hat keine persistenden Daten
o Kann (optional) Teil einer Transaktion sein
o Einsatz falls:

Falls Server lange braucht um Resultat zu
brechnen

Client nicht dauernd Online ist

Um Daten zwischen 2 Systemen im
Hintergrund abzugleichen (falls nicht anders
möglich)
o Aufrufmodelle
 Publish and Subscribe
 Queue (Point to Point)
o Unterstützung durch Java Messaging API (JMS)
 Typen von Meldungen: (TextMessage,
MapMessage, ObjectMessage,
StreamMessage, BytesMessage)
 Message besteht aus einem Header und
einem Body
o
o
o
o


Remote Interface

Statless Eigenschaften
o
speichert Keine Inform. zwischen den
o
o
o
o
o

Aufrufen.(sollten kein Threading machen)
Stateless Beans werden in einem Pool verwaltet
Sind nur wärend des Aufrufs einem Client zugeord.
Sind effizient im Umgang mit Ressourcen
Load Balancing => Last kann/wird besser verteilt
Beispiel: Ich benutze ein nächstes freies Taxi aus der
Taxi Warteschlange
Statefull Eigenschaften
o
Zustand wird zwischen Client.Aufrufen gehlaten; eine
o
o
o
o
Instanz ist über mehreren Methodenaufrude explizit
einem Client zugeordnet
Bleibem so lange beim Client, bis er diese abgibt, oder
nach einem bestimmten Timeout
Sind weniger Effizient (da Zurodnung durch Cintainer
wieder erfolgen muss)
Sind nicht Ortsunabhängig (location transparent) ->
Problem bei Load Balancing und Server-Cluster
Beispiel: Ich habe meinen privatwagen im Flughafen
parkiert
Local Interface








Schnittstelle für Remotezugriff auf die EJB Klasse
NamensKonvention BeanRemote.java
Hat die selben methoden wie die EJB Klasse
Remote Client spricht EJB über R. Interface an.

EJB Implementation




Implementation der Funktionalität
Namenskonvention BeanNameBean.java
Implementiert die Home/Remote interfaces Allg. nicht
direkt, sondern ist nur lose verpflichtet ber
Namenskonvention
Die Callback Methoden werden benutzt mit den
entsprechenden Annotationen z.B. PostConstruct
zweiter Satz von Schnittstellen für likaeln Zugriff
zur Optimierung für Zugriff innerhalb derselben VM
Nameskonvention BeanLocal.java
Entwickler kann Remote oder, Local Interfaces oder beide
erweitern
ACHTUNG: Unterschiede beim Gebraucht z.B. byRef und
byVal, Parameterübergabe, Exceptions etc.
Deployment Descriptor
 Konfiguration eines EJB hinterlegt im ejb-jar.xml


Ab EJB3 meisst via Annotationen
Annotationen können durch Einträge im Deployment
Descriptor übersteuert werden
EJB Technische Umsetztung


Interception
o
Unterbrechnung des Programmflusses zur
Behandlung eines Concerns
o
Vorher-Interception
o
Nacher-Interception
o
Anstatt-Interception
Dependency Injection / Inversion of Control
o
Container "impft" die Werte/Verweise in
Beans ein
o
Stellen für das "einimpfen" sind
entsprechend markiert
o Im Gegensatz zum Lookup: Hier wird bei
einem von dem Container auf das Bean
zugegriffen (Inversion of Control), beim
Lookup greift das Bean auf eine
"Systemkomponente" zu.
Transaktionen
ACID Prinzip für Transaktionen




Atomicity => Jede Transaktion wird ganz oder nicht
ausgeführt
Consistency => Transaktionen hinterlassen die
Datenbank in einem konsistenten Zustand
Isolation => Transaktionen erscheinen, als wenn sie
hintereinander (sequentiell) ausgeführt würden.
Durabillity => Wenn eine Transaktion erfoglreich
beendet ist, sind ihre Änderungen an Daten
persistent.

EJB Transaktion-Handling (schlechte Variante)



Container Managed Transactions Demarcation
(CMTD)
 Container übernimmt Steuerung der Transaktionen
o Startet eien Transaktion bei Bedarf
o
Stellt korrektes Verhalten sicher => Macht





Rollback im Fehlerfall
Konsequenz von CMTD: Bean darf die Transaktion
selber nicht mehr steuern
EJB gibt Container Hinweise wie die Transaktion
gesteuert werden soll. (Deklarative
Transaktionssteuerung)
EJB muss durch
@TransactionManagement(Container)
gekennzeichnet werden.
@TransactionManagement(TransactionManagementTy
pe.CONTAINER) // optional, default
@TransactionAttribute(TransactionAttributeType.SUPP
ORTS)
Typischerweise werden Transaktionen in Session
Beans gestartet
Transaktions Attribute können entweder am Anfang
JDBC auf Ebene EJB hat das Problem, dass mehrere
Datenbankenzugriffe in einem EJB nicht sauber handeln
könnte. Bei allen Teilnehmer muss die Transaktion
commited werden.
Steuerung erfolgt über das JTA (Java Transaction API).
Dies kann auch im EJB gemacht werden(Bean Managment
Transaction Demarcation BMTD nicht empfohlen). EJB
muss dann mit @TransactionMangement(BEAN)
gekennzeichnet werden.
o
Problem 1: Neested Transaction => EJB ruft EJB
auf
o
Problem 2: Transaktion auf Client gestartet und
Client stürzt ab => Lock bleibt bestehen.
Besser ist Container übernimmt Transaktion-Handling..
Transaktions Attribute
 @TransactionAttribute(REQUIRED) => EJB wird immer in





einer Transaktion ausgeführt. Wenn Client bereits eine
Transaktion gestartet hat wird das EJB in dieser ausgeführt,
falls nicht wird eine gestartet.
@TransactionAttribute(SUPPORTS) => Je nachdem ob der
Client bereits eine Transaktion gestartet hat oder nicht.
Wird das EJB in einer Transaktion ausgeführt. Es wird keine
eigene Transaktion gestartet!
@TransactionAttribute(NOTSUPPORTED) => EJB wird
NIEMALS in einer Transaktion ausgeführt. Egal was der
Client macht.
@TransactionAttribute(REQUIRES_NEW) => Es wird
immer eine NEUE Transaktion gestartet, egal ob der Client
bereits eine gestartet hat oder nicht.
@TransactionAttribute(MANDATORY) => Das EJB muss
zwinged in einer vom Client gestarteten Transaction laufen,
falls Client keine Trx. gestartet hat wird eine
TransactionRequiredException geworfen.
@TransactionAttribute(NEVER) => EJB wird niemals in
einer Trx ausgeführt. Falls der Client eine Transaction
gestartet hat, wird eine RemoteException geworfen.
der EJB Klasse defniert werden (dann gelten Sie für
das gesamte EJB), und /oder bei jeder Methode (falls
unterschiedliches Handling erwünscht)
Client startet Transaktion (Funktion)

Verteilte Transaktionen
 2PC (TWO PHASE COMMIT) Trx. über mehre DBs
 Trxs. über mehere Machinen
 Trxs. über mehrere EJBs
 Trxs. übers Netzwerk
 Optimierung möglich falls Trx innerhalb Container
 Aufteilung der Aufgabe auf:
o Transaktion Manager => koordiniert verschiedene
Ein echter Client kann Transaktionen starten und
steuern.
Client erhält durch InitalContext (Lookup) eine Objekt
UserTransaction mit welchem er die Transaction
steuern kann. Z.B. kann erdie Trx. auf
setRollBackOnly() setzten. (Methoden werden dann
aber immer noch abgearbeitet). Oftmals möchte man
jedoch lieber eine Exception => throw new
AppException() benötigt
@ApplicationException(rollback = true) im Client
Nie über unsicheres/instabiles Netzwerk (Internet)
verwenden)


Interceptors & Ressource Adapter
Interceptors

o
o
Ressource / steuert 2PC
Ressource Manager => steuert Ressource
Ressource: macht eigenetliche Arbeit
.
Werden benutz um eigene Apskete (zusätzliche
technische Funktionalität) transparent einzubauen.
Werden Custom Interceptors genannt
Wird vor und /oder nach dem EJB Aufruf gestartet
Gekennzeichnet durch die Annotation
@AroundInvoce
Ist Teil des EJB Methoden Aufrufs (Teilt
TransationsContecxt, kann selbe Exception werfen,
kann die diversen Manager z.B. JNDI verwenden)




Verwendung eines Interceptor im EJB


Mit Annotation @Interceptors(MyInterceptor.clss)
Kanna auch im EJB Descriptor definiert werden
Ressource Adpater
 Für Zugriff auf Fremd und Legacy-Systeme
 Solche Systeme nennt man Enterprise Information




Systeme (EIS)
Ein Ressource Adapter bietet definierte
Schnitstelle auf diese EIS an.
Man muss nur noch ein Adapter pro EIS
implementieren. Früher hatte man n x n
Verbindungen
Man unterscheidet zwischen Verwalteten
Umgebungen und nicht verwalteten Umgebunden
Ein EJB in seinem Cointainer ist eine Verwaltende
Umgebung

Datenbankzugriffe und Entity Beans
Dantenbank Zugriff via Session Bean
o
o
Datenbank-Zugriff über JDBC
o
Probleme: Datenbank-Treiber Typ ist hart
kodiert
o
Benutzername und Passwort im Code
(Sicherheitsproblem)
EJB-Lösung
o
Datebank-Parameter werden ausserhlab der
Anwendung definiert
o
Diesem Parameter wird ein symbolischer
Name zugewissen mittels JNDI wird dann
auf die Datenbanks als DataSource
zugegriffen
o
Vorteil:

Erlaubt Connection Pooling

Inversion of Control
Code Beispiel:
JDBC:
String urlSTring ="jdbc:odbc:odbcsourcenam";
String username="dba", password ="sql";
Class.forName("sun.jdbc.obdc.JdbcOdbcDriver");
Connection con =
DriverManager.getConnetion(urlString, username,
passowrd);
DataSource mit JNDI:
InitialContext ctx = new InitialContext();
DataSource dozentenDS = (DataSource)
ctx.lookup("jdbc/DozentenRessource");
Connection con = dozentenDS.getConnection();
con.close();
Benutzt Annotations für Dependency Injection
(@Resource => JDBC)
JPA (Java Persistence API) siehe auf
Zusammenfassung von Andy. Hier nur
Ergänzungen
Vererbung und abstrakte Klassen: Table_PER_CLASS
Persistence.xml und J2EE
Life Cycle
Einfaches EM Beispiel:



Fetch Type bei Relationen (EAGER und LAZY)
Bei Eager werden sofort alle Beziehungen nachgeladen (ergibt
ein dickes Select Statement). Bei Lazy wird nichts nachgeladen,
höchstens wenn auf die getters Zugegriffen wird (ist aber auch
nicht bei allen JPA Implementationen der Fall).
z.B. @OneToMany(fetch=FetchType.EAGER)

Persistence Context in J2EE



Weiss den Status seiner Entity Beans
Stellt sicher, dass EntityManager nacher weiss ob er
Rollback oder Commit machen muss.
Zwei Arten:
o
Transaction-Scope Persistent Context

Context lebt nur so lange wie
dass EJB, wird die Transaction
abgeschlossen, stribt auch der
Context. (StatelessSessionBean)
o
Extended Peristent Context

Bei längeren User Conversationen
benötigt

EM und somit der Context bleibt
vorhanden über mehrere
Transacationen hinweg

Entity Beans bleiben im Zustand
managed

Es wird Optimistisches
Locking verwendet.
Ein paar JP-QL (Java Persistence Query Language)
und EM Funktionen


Einfaches Query mit createQuery
StoredProcedures mit createNamedQuery (Es braucht
eine Annotation mit @NamedQuery(name="",
queryString="") dafür
new Transient => Zustand des Bean nach der
Instanzierung. EM kennt dieses Bean nicht
managed => Bean ist mit Persist dem EM bekannt gemacht
detached => Kopie des Beans existiert in der DB, ist aber
von dem EM entkoppelt. Muss zuerst wieder merged
gemacht werden, damit der EM dieses Bean wieder
verwaltet
removed => Bean wurde als gelöscht markiert. Es kann
durch die Methode merge wieder in den Zustand managed
gebracht werden ansonsten wird es beim Ende der
Transaktion oder beim einem flush gelöscht.
Optimistisches Locking


EM versucht durch merge Objekt wieder persistent zu
machen am Ende der User Conversation. Durch ein
VersionFeld auf der DB, kann er prüfen ob die Versionen
übereinstimmten. Falls Nein gibt es einen Fehler.
Falls ein Fehler auftritt bedeutet dies eine andere Trx hat in
der Zwischenzeit eine Änderung vorgenommen. => Version
wurde gändert...
CallBack Methoden:
.
.
.
.
@PrePersist, @PostPersist
@PreRemove, @PostRemove
@PreUpdate, @PostUpdate
@PostLoad





query.getResultList()
query.getSingleResult()
@PersistenceContext auf EntityManager in Entity bean
IS NULL IS EMPTY im SQL (IS EMPTY ist ein Leerstring)
wird auf zwei Klassen zugegriffen erhält man ein Object
Array in dem je ein Objekt einer Klasse vorhanden ist.


query.setParamet("KEYWORD", variable) => Wort in
SQL muss :KEYWORD sein
query.setMaxResults(ANZAHL)
Monitoring & Management Dienst / Java Management Extensions (JMX)
Es wird in grossen Betrieben gewünscht:
Monitoring bei JEE:



Überwachung eines Systems oder einer Ressource im
laufenden Betriebt
o
Status Mointoring
o
Fehlersuche, Diagnose, Debugging
o
Alarmierung bei Fehlern
o
Performance Analyse
Konfiguration des Systems, Ressource zur Laufzeit
o
z.B. Logging Level
Probleme:
o
Viele einzelne Komponenten
o
Keine/viele Standards
o
Werden nicht vom Entwickler vorgenommen





JMX


Zwei Arten von MBeans (Überwachungsbeans)
o
Standard MBeans (Schnittstelle wird durch
Java Interface definier)
o
Dynamic MBeans (Schniststelle durch
MBeanInfo Klasse, Schnisttelle kann zur
Laufzeit geändert werden)
Naming ist = ReesozurcenNameMBean (Interface)
Standard MBean
Dynamic Bean
Performance Daten/Statistikt
o
Ermitteln der Seitenaufruf
o
Antwortzeiten
o
Logs/Probleme
Transaktionen
o
Anzahl von Commits/Rollbacks
o
Durchschnittl. Anzahl geblockter Beans
Conntection Pools:
o Anzahl Connections
o Avg. Wartezeit
Überwachung der App
o
Auslesen/Ändern AppParam zur Laufzeit
o Backend Ressourcen
o Fachliche Properties
Zustellung von Nachrichten bei
o
Fehler
o Zustandsänderungen
Anmelden des MBeans
Zugriff z.B. über JConsole!!!
Anhang
 Java Annotation
o
o
o
o
o

Imperative Programmierung: es wird beschrieben, wie etwas gemacht wird.
Deklarative Programmierung: es wird beschrieben, was gemacht wird.
Cheat Sheet für EJB Annotation Anhang
Wichtig:

Value bei einer Annotation kann ein Wert oder ein Wertearray sein (Werte Array werden mit { "WERT1",
"WERT2"} gekennzeichnet.

Enum Werte Ebenfalls als Parameter möglich

Default Werte für nicht gesetzte Variablen z.B. default "MyNewClass"

Bekannte Annotations: @Override, @Deprecated, @SuppressWarnings
Vor und Nachteil:

+ Tennung von Core und System Level Concerns

+ Schritt in Richtung deklarative programmierung

+ Teil der Java Sprache

+ Stehen an der Stelle im Code auf den sie wirken (Kapselungsprinzip)

- An den Quellcode gebunden, müssen Neukompiliert werden bei Änderung
EJB 2.1 => 3
o
o
Kritik an EJB 2.1

Sehr umständlicher Entwikclungszyklus

zu komplex

viele voneinander abhängige Einzelteile, viel Redundanz

Container sind empfindlich gegenüber Fehlern im XML-Deskriptor

Keine Unterstüzung für plattformunabhängige EJbs (in kompilierter Form)

Fast jedes EJB braucht zusätzliche herstellerspezifische Deskriptoren

Testautomatisierung schwierig

Zu transaktional (viele Anwendungen wollen nur lesen und nicht schreiben)

Keine Unterstützung für optimistisches Locking

etc.
Neu in EJB 3.0

Weitgehende Elimination/Vereinfachung der Deskriptor-Dateien => Jetzt durch Annotations

Enterprise Beans sind so vereinfacht das sie sher ähnlich zu POJOS bzw. Javabeans sind

Verbessertes Testing innerhalb des Anwendungsserver

etc.
Herunterladen