Archive zu Kategorie 'Konferenzen'
13. September 2008 von KG
Ralph Bergmann, Student an der FHTW Berlin, hat mit viel Energie und Elan die Java User Group Berlin-Brandenburg (re-)vitalisiert. Höhepunkt seiner Aktivitäten ist die erste Berliner Fachkonferenz um die Programmiersprache Java, die berlin.jar.
Im Vergleich zu den großen kommerziellen Java-Konferenzen (in Deutschland die JAX, US-international die Java One) nimmt sich die berlin.jar bescheiden aus:
Alle Besucher (zumindest, die mit denen ich sprach) wurden von Ralph Bergmann persönlich begrüßt.
Nett.
Jedenfalls etwas ganz anderes als die spektakulären Bühnenbegrüßungen von Sebastian Meyen, der ansonsten auf der JAX stets recht arrogant/gestresst agiert, wenn man sich nicht durch Anzug oder Speaker-T-Shirt ausweisen kann.
An zwei Tagen werden Samstags vier Vorträge in fünf Tracks angeboten, am Sonntag drei. Daneben können Samstags noch Workshops besucht werden (v.a. Eclipse RCP und Tomcat 6).
Die Konferenz findet – naheliegend – in den Räumen der FHTW Berlin in der Treskowallee statt. Menschen von der User Group und offenbar auch Studenten (?) unterstützen die Veranstaltung, ein einem Gang sind drei Stände aufgebaut.
Essen wird an Grill und Suppenküche ausgegeben, leider alles nicht ganz mit den Veranstaltungszeiten koordiniert. Für die erste Veranstaltung dieser Art, zudem nichtkommerziell, ist das akzeptabel.
Was macht aber eine Konferenz wertvoll? Natürlich die mobile Massage in der Relax-Lounge! Mögen manche sagen. Andere finden eher die Qualität der Vorträge entscheidend. Hier braucht sich die berlin.jar nicht zu verstecken: Von Oliver Böhm über Peter Roßbach (!Tomcat Workshop!) zu Eberhard Wolff sind viele Größen der deutschen Java-Community vertreten. Die Qualität der von mir besuchten Vorträge braucht sich zumindest hinter denen der Vorträge auf der JAX nicht zu verstecken.
Alles in allem eine lohnende Veranstaltung, für den lächerlich niedrigen Eintrittspreis (15,- EUR im Vorverkauf, Verköstigung inklusive) bekommt im Vergleich zu den kommerziellen Veranstaltungen ein Vielfaches als Gegenwert.
Dieses Angebot nutzten am ersten Tag nach meiner Einschätzung (Mittagessen und "Abendparty") mehr als 100, aber sicherlich weniger als 250 Teilnehmer, davon etwa 3% Frauen (leider nicht eine einzige Vortragende, sehr schade, dass Angelika Langer nicht anwesend war).
Hochachtung verdient Ralph Bergmann und seinen Helfern für den Einsatz, der weitaus mehr von einer Begeisterung für die Technologie spricht als von reinem Profilierungsdrang. Dazu wurde zuviel gelächelt.
27. April 2007 von KG
Eberhard Wolff – Java Champion, Autor d. Buchs im dpunkt-Verlag (Eberhard Wolff – Spring) (dpunkt).
Mike Wiesner: Fokus auf Security.
Interface 21. Rod Johnson. Jürgen Höller (Linz) Hauptentwickler
Ausgangspunkt: Kritik an EJB. Deshalb mit POJOs (also known as "Simple Objects") arbeiten.
Java EE Design-Pattern-Ansatz zu komplex.
DI – AOP – Portable Service Abstractions.
Pluggable Architecture. Spring MVC. JNDI JPA, JTI etc.
Leightweight remoting, JMX.
Inversion of Control
Inversion of Control
^-Dependency Lookup ^-DI
^-Setter Injection ^-Constructor Injection
Setter Injection
Spring setzt setter-Werte. Parameterloser Konstruktor nötig.
Nachteil: Inkonsistenter Zustand möglich, wenn wesentliche Properties fehlen. BeanInterface (aber schlecht: abhängig vom Framework) – besser init method => Ruft init-Methode auf. Oder setter mit @required erstellen, dann prüft Spring von selbst. noch besser:
Constructor Injection
Kann mit setter-I. kombiniert werden. Indizierung der Parameter.
<constructor-arg index="0" ref="accountDao" /> (Index kann bei unterschiedlichen Typen auch weggelassen werden).
Dagegen spricht: super()-Aufruf bei Vererbung, Parameter so nicht mehr verwendbar. Kein Mechanismus, den Objekt-Status zu refreshen.
Unit Test
Nicht an Container denken, Objekte mit new() erzeugen.
Spring Containers
IoC und lookup Features. mit new einfach zu erzeugen:
ApplicationContext theContext = new ClassPathXmlApplicationContext("spring-config.xml");
Bsp. deklarativ in web.xml – aber nicht empfohlen. Test-Case-Bsp.: protected String[] getConfigLocations()
Spring-Beans brauchen nicht ausgelesen zu werden. ###Files mit Aufgaben und Präsentation hochladen###
AbstractTransactionalDataSourceSpringContextTests:
Rollt DS nach Testaufruf auf Anfangszustand zurück.
Autowiring
Um Referenzen automatisch zuzuweisen. Nachteil: Weniger verständlich. Empfehlung: Eher nicht benutzen.
AOP
Spring AOP kann ohne DI benutzt werden. Bsp. Eclipse RCP. "Decoration through configuration".
Crosscutting concerns. Advices – Pointcuts. Einige Aspects out-of-the-box.
jamon – Monitoring einfach einzurichten.
AOP-Proxy – bezieht sich nur auf Spring-Beans (!), also z.B. nicht bei Selbstreferenzierung. Aspekte für AspectJ transformierbar von Spring AOP. Unterschiede: Keine Feldzugriffe mit Spring AOP. Dadurch, dass Bytecode erzeugt wird, kann AspectJ auch selbstinstantiierende Klassen finden.
Advice-Typen: around (via ProceedingJoinPoint), before, after, throws.
Kurzer Verweis auf http://www.easymock.org/
Beispiel für Einbindung.
<aop:config>
<aop:aspect id="traceAspect" ref="traceInterceptor">
<aop:around pointcut="execution(* dao.*+.*(..))" method="trace" />
</aop:aspect>
</aop:config>
Aufruf Unit-Test auch mit -DSPRING_XML_FILE=aop-pojo.xml in Eclipse als VM arg. Annotation-Aspects gut für Transaktionen, ansonsten immer schlecht, wo es schlecht ist, wenn der Code geändert wird.
@Pointcut("execution(* dao.*+.*(..))")
public void traceMethods() {
}
Hack, damit über
@Around("traceMethods()")
darauf referenziert werden kann.
Annotations-Aspekt kann auch in AspectJ wiederverwendet werden, XML-POJO nicht. Bestimmte Views der SpringIDE: Bean Explorer; Bean Cross Reference; Spring AOP Event Trace.
Effective Middle Tier
Service Objects /Business Facade _transactional boundaries. Logik auch in Domain-Objekt, zu Lasten der Interoperabilität.
Stateless, POJO.
DAO Interfaces
DAO Implementations
Data Access Layer
Persistence hidden; Impl Class; Throws unchecked exception; Stateless, POJO. Gut mit Singleton Spring Beans. Domänenobjekte. POJOs.
Distributed Spring
Referenzen auf Server injizieren. RMI, HttpInvoker – http + Serialisierung.
Server erstellen. Client erstellen. Seeeehr einfach. Funktioniert auch mit JMX. BeanFactoryPostProcessor. (Erläuterung, wie man über PropertyPlaceholderConfigurer Werte in *.properties-Datei [oder DB oder Input etc. etc.] auslagert und Werte in XML mit ${valuename} auslagert.
spring-modules hat auch eine Impl für Commons Configuration.
Template Pattern
Extreme Vereinfachung von Zugriff auf Persistenzlösungen + JMS. Von Spring verwaltet, ohne Mächtigkeit zu verlieren. Beispiel:
getSimpleJdbcTemplate().update("DELETE FROM T_ITEM WHERE ID=?", "name");
Exception Hierarchies.
DataAccessException – all exceptions extend one single class. Erweiterbar. Vorbereitete Klassen, z.B. für SPs, die Fehlercode zurückgeben.
Datasource auch über JNDI-Lookup im J EE Appserver.
###Notiz: Wenn man Convention over Configuration folgte, sollte man IMHO für Spring stets drei Defaultverbindungen verwenden.###
Transactions
DAOs nehmen automatisch an Transaktionen teil. Gilt auch für Verbindungen von Persistenzlösungen. DataSource über Connection. Two-Phase-Commit: JOTEM/Atomicus f. Java SE. Ansonsten Integration mit Appserver und JTA.
iBATIS
"Sweet spot" zwischen JDBC und ORM. Wohlbekannt…
Integration mit JavaSpaces: AUf Java Modules (?). Spring ist technologieneutrales API.
MSB – Support injizierbar.
Spring + JSF
Auf Spring Beans via JSF zugreifen, als wären es Managed Beans.
jsf-spring-Projekt: Umgekehrt.
Quartz
Wie JMS. POJO-Bean mit Aufrufmethoden. Sah sehr einfach aus.
Security
Acegi. Unabhängiges Framework. ServletFilter.
KGs Fazit:
Der Stoff eines ganzen Buches von zwei höchstprofessionellen, aber augenscheinlich gelangweilt-genervervten-erschöpften "Trainern". Hätte ich den Enthusiasmus, das Feuer bei der Präsentation als Richtschnur genommen, wäre ich unweigerlich zur Vermutung gelangt, die beiden wären vom Java EE Marketing aufgekauft. Spring ist ein excellentes Framework, das die Entwicklung verteilter Anwendungen ungemein erleichtern kann. Dies wurde zwar vermittelt, aber in einer Weise, als ob es sich um etwas Langweiliges handele. Für einen "Rundumschlag" an einem Tag, der IMHO damit enden sollte, dass alle Entwickler begeistert noch auf der Heimfahrt an den Beispielen weiterarbeiten, fehlte der Elan, vielleicht auch die didaktischen Fähigkeiten von Eberhard Wolff, dessen Naturell aber vielleicht eher auf Coolness/Phlegma hingerichtet ist.
26. April 2007 von KG
Origins
"Teflon-Effect": Thoughtworks Time and Expenses System (with Plone). Mercury testing suite (element Selenium protects from Mercury toxity).
Acceptance Testing Tool. Test runs directly in the browser, analysing the DOM. BrowserBot -takes commands and exercises the app as if it was the user.
http://selenium.houghtworks.com
http://www.openqa.org/selenium
Usage
Modes:
TestRunner -put core alongside the app (means static HTML dir).
RemoteControl ("driven mode").
Test cases: Simple HTML tables
| Ignored |
Command | Target | Value
Command | Target |
Assertion | Expectet | Actual
TestSuites possible.
Understands everthing that can be done by the user and additionally things like changing cookie values.
Concepts
Locators: Find things on the page. id, name, identifier, dom=JS expression
Matching Patterns: glob:pattern, regexp, exact, default is glob
Select: label, value, id, index
Actions: Action, actionAndWait, open
Assertions: Assert, Verify (continue the test in case of a failure), waitFor (e.g. for AJAX – wait until field changes the value)
assertConfirmation: JS confirmation dialog.
Parameters and Variables: store, storeValue, storeText, storeAttribute, stored in JS map storedVars
Variable Substitution – JS Evaluation
Selenium Techniques
Generating UIDs
Creating Test Case JSPs.
Assert sthg not existing. assertXPath extension (on openqa).
Fits into CruiseControl.
auto="true" => /postResults => CC
Remote Control Selenium
Drivers for Java, .NET, Python, Perl, Squeak, and Ruby. Jetty-based proxy-server. Issue Selenium commands – allows to issue all commands via JUnit tests…
Purely declarative Selenium syntax can be broken up.
User-Extensions
user-extensions.js : e.g. own actions. Own locators and assertions (see openqa).
Selenium-IDE
Firefox-Extension. Recorder. With intelligent addons-e.g. forward-engineer macros to remote scripts in all languages.
###XPather + XPath Checker ###
Future
Driver capabilities. 1.0 soon. Documentation for driver. DSL-like language to supplement HTML.
File Uploads possible with Firefox.
Question: What about integration with Fit/FitNesse (e.g. http://www.cornetdesign.com/2006/09/fitnesse-selenium-wrapper.html or http://storytestiq.sourceforge.net/index.html)? Neal Ford didn’t seem to see any use for it as he understands FitNesse also for functional tests and Selenium only for acceptance tests. ###TODO: Send an e-mail to him###
https-Support (one-time import of the certificate)
(KG’s) Summary
This is "best-of-breed" technology for free. Whoever works in smaller/midrange IT departments and wants to spend money for a commercial tool is going to burn money. The multi-language facility via the remote runner makes Selenium quite adjustable. E.g. the integration with CruiseControl and even JUnit test cases makes it highly valuable.
The Selenium IDE can compete with professional Testing UIs. It’s AJAX support is stunning. Haven’t seen any commercial competitors yet.
26. April 2007 von KG
Thomas Spiegl: Committer MyFaces.
Einstieg: http://facelets.dev.java.net
Nachteile von JSP… JSF 1.1-Problem falsche plazierte Renderung, kein Template-Framework. MyFaces hat Tiles-ViewHandler.
Warum Facelets verwenden:
HTML-Content kann schlecht in Komponentenbaum eingefügt werden.
1.es Beispiel
<h:panelGrid columns=1">
<h1><h:outputText value="text" />
</h1></h:panelGrid>
Rendert als:
<table><tr><td>text</td></tr>
<h1></h1>
</table>
(Ist aber bei 1.2 gelöst mit automatischem verbatim-Tag).
2.es Beispiel
<h:outputLabel for="name" />
<h:inputText id="name" />
JSP und JSF 1.1: Label wird erst beim 2.en Request auf die Seite gerendert.
Facelets und JSF 1.1: Label wird gerendert. Komponentenbaum wird vor Renderphase aufgebaut.
(Ist auch bei JSF 1.2) vorhanden.
DataTable mit DataScroller – funktioniert nur, wenn der DS unterhalb der Table liegt.
- Performance 10-15% besser als JSP.
- besseres Error-Reporting.
- "leichte" Komponenten
- einfaches Templating, ohne XML;
- besseres Error Reporting – in web.xml. ui:debug
- Designerfreundlich.
- Konzept w
Einrichten
FaceletViewHandler einbinden in faces-config.xml
Tag Libraries in facelets.LIBRARIES (web.xml Context-Param)
facelets.DEVELOPMENT
facelets.BUFFER_SIZE
facelets.REFRESH_PERIOD; Standard = 2 (Sekunden), lädt die XHTML-Dateien nach. -1 zum Ausschalten.
facelets.VIEW_MAPPINGS
facelets.SKIP_COMMENTS false ist default. Sonst werden Kommentare übermittelt.
facelets.BUILD_BEFORE_RESTORE default: false. Facelet baut Komponentenbaum ganz ab Beginn auf.
Erforderliche jars:
- el-ri.jar
- el-api.jar
- jsf-facelets.jar
JSF EL auch zum Schreiben von Properties. EL-libs für 1.5 kompiliert, aber im Netz auch noch für 1.4.
Maven-Konfig: Dependencies. http://maven-repository.dev.java.net/nonav/repository
Legacy-Attribut setzen für mvn2
Logging-Eigenschaften separat.
Beispielseite: Normales XHTML, Namespaces eingebunden.
Templating
xmlns:ui="http://~"
Verwendung
mit ui:composition und ui:define. Alles außerhalb wird nicht geändert
Beispiel: XHML-Datei erstelllt. Facelet-Namespace geholt und ui:definitionen => Template
Neue Datei mit Verweisauf Template. <ui:composition><ui:define name="content" >Das ist Inhalt => überscjreibt default-Wert.
ui:decorate : Inhalt fügt sich ein, alles Umgebende wird mitgerender
jsfc – Zur Kompilezeit Element in Komponente umwandeln.
<input type="text" jsfc="h:inputText" etc.
JSTL-Support: Nur eingeschränktes Set. Probleme beim Rendern: encodeChildren="true"
ui:repeat statt c:forEach (buggy); besser rendered="true" oder t:dataList
Custom TagLibs
Komponenten rein aus XHTML – TagHandler, Converter, Validator,
2 Alternative: 1 XML-Tag pro Komponente
1 XML-Tag, das eine Java-Klasse spezifiziert, welche die Konfiguration ausführt.
<facelet-taglib>
<namespace …>
<tag>
<tag-name> etc.
Oder an Klasse binden (aber ungewöhnlich)
Einbindung der TagLib. Context-Param in web.xml facelets.LIBRARIES
oder Meta-Inf-Einbindung über WEB-INF/lib (automatisch)
Dynamische Komponenten
in Facelets library
Beispiel f. Eingabekomponente.
ui:component alle Anderen sind Kind-Elemente.
Ist echte Komponente im Baum.
Label mit Eingabekomponenten-Validierung. <f:validateLength>, indem in Template <ui:insert /> eingefügt wird. Input-Text bekomment Validator gesetzt
Dynamische Menüs-Beispiel.
Beispiel: Table-/Scroller-Kombination.
Method-Binding
funktioniert nicht: action="#{myBean.myAction}"
sondern backing="{#myBean}" action="myAction"
und command action="backing[myBean]" (###?, prüfen###)
Welche <ui:…/>-Tags
ui:fragment: rendert auch außenstehenden Text.
ui:composite
ui:decorate
ui:component
EL-Funktionen
JSP-Komponenten müssen in Taglib definiert werden. Component-Type + -Renderer festlegen.
Taglibs z.B.zum Einbinden in Tomahawk, auf Wiki-Seite von Faces.
Tag-Handler – Beispiel für Method-Binding. Tag-Handler nur einmal. dataTable-Tag-Handler: var-Spezialität. In Tomahawk kann das var-Attribut über Binding angespr werden
MetaRulest -Aliase, Attribute ignorieren, Meta-Rules f. Method-Binding.
Inlined EL-Expression: unterstützen keine Konvertierung und kein Encoding (also für Prototyping)
Debugging-Ausgabe: Mit Component-Tree und Scoped Vars, sehr nützlich.
In JSF 2.0 sollte eine ähnliche Technologie im Standard vorhanden sein (2008).
KGs Fazit:
Facelets sind JSP eindeutig vorzuziehen. Erhebliche Erleichterungen beim Erstellen von Taglibs. Intuitiveres Programmieren.
26. April 2007 von KG
Intro
Über S.H.: von Struts über JSF, Spring MVC zu Grails. Erstellt Grails Podcast.
Motivation
Framework wie Rails – Convention over Configuration, DRY
Spring MVC im Hintergrund
Grails vs. Rails Benchmark – Skaliert weitaus besser als Rails. 1.0 Release im Sommer, 0.5 im Mai.
grails clean
grails update
zum Update, soll schmerzlos sein.
Benutzte Frameworks
Spring: Spring DI + Spring MVC
Hibernate
SiteMesh – Layouting
Java EE – Integration
Standalone oder Hib-Mappings f Legacy-Schemata; EJB3-Integration; vorhandene Spring-Beans können verwendet werden.
Quickstart siehe am besten hier.
ApplicationBootStrap zum Persistieren.
TL-Erzeugung. Zur Laufzeit deploybar, ebenso mit Controller + Service.
Server-Start runApp.groovy. snipplr.com
MVC in Grails
Model: Domain-Klassen etc.
class Podcast {
String title
String feedUrl
}
View: Groovy SP oder JSP; dynamic TagLibs
Controller: Grails Controller + Grails Service
Object-Relational Mapping GORM. Equals()/hashCode() werden automatisch + dynamisch erstellt.
grails create-domain-class
Mapping 1:1
class Podcast {
Author author
String title
}
Mapping 1:n
class Podcast {
def hasMany = [ episodes : Episode ]
String title
}
Mapping m:n
class Podcast {
def hasMany = [ episodes : Episode ]
String title
}
class Author
{
def hasMany = [ podcasts : Podcasts ]
}
GORM: Dynamic Finders
Podcast.findByTitle(), QBE + HQL unterstützt.
Constraints
class Podcast {
String title
String feedUrl
static constraints = {
title(size:1..50)
feedUrl(unique:true)
}
}
GORM DB Konfiguration
development/production/test
Classe Development[...]DataSource ändern. Standard: Development.
View-Technologien
Die meisten verwenden GSP wg. der Dynamic Tag Libs.
Grails Controller
Generierbar (mit CRUD), wird dynamisch geladen. Immer alle CRUD-Operationen werden erstellt, DELETE kann z.B. nicht ausgeschlossen werden. Controller und Views müssen entsprechend manuell angepasst werden.
Parameter, Session, Flash-Objekte.
render()-Methode sehr mächtig – AJAX
HTTP-MEthod-Restrictions.
Dynamisches Scaffolding
im Bsp.: def scaffold= Podcast
Services
Kapselung von Business-Logik.
Buchempfehlung Getting Started with Grails (InnoQ)
26. April 2007 von KG
Historie – von make über Ant, Maven 1 zu Maven 2. Einfluss der Rails-Community. Komplett neue Implementierung von 1.
Paradigmenwechsel: Nicht Build-Skripte erstellen, sondern Projekte konfigurieren.
Nicht das wie des zu erzeugenden, sondern das was. Mehr managen als erzeugen. OO-Mechanismen zur Konfiguration (also Projekt).
mvn2 hilft bei einem Großteil des Entwicklungsprozesses. Unterstützung für
- Kompilation
- Releaserstellung
- Bibliotheksabhängigkeiten
- Dokumentation
- Unit- und Integrationstests
- nn
- nn
Weniger ein Tool wie Ant – vielmehr eine standardisierte Best-Practices-Enforcment-Box.
Konzepte
Project Object Model, beschrieben in pom.xml. Name + Version + Typ, Vererbung, Unterprojekte (Module), Abhängigkeiten und Repos, Lifecycle- Plugin Konfigurationen, Profile, Properties, sonstiges (Issue Tracker, Version Control etc).
Artifact:
Ergebnis (Produkt) eines mvn2-Projekts. Typen: jar, war, ear, sar; plugin, archetype, pom.
Werden in Rep abgelegt. Jedes mvn2-Projekt erzeugt lediglich ein Ergebnis (dadurch Modularisierung erzwungen).
Goal
Wie Ant-Target.
Plugin
Logische Gruppierung von Goals. In Reps verwaltet.
Syntax: plugin:goal
archetype:create – Skeleton für weitere Projekte.
cargo:start – Für Java EE interessant.
compiler:compile: Quellcode kompilieren.
Repositories
Zentrale Stelle, in der alle Artifacts abgelegt werden. Zwei Type: Lokal (file://[user-home].m2/repository), Remote (z.B. http://repo1.maven.org)
Dependency-Management
Alle abhängigen Artefakte über Repositories verwaltet, werden nicht physische in das Projekt kopiert. Kein "Jarmaggedon".
Build-Lifecycle
Definiert in Phasen: validate-generate-resource-compile-test_compile-test-package-integration_test-install-deploy. Phasen mit plugin-goals verbunden.
Reports
QA-Reports, generelle Projektinformationen.
Frage: Wie funktioniert das innerhalb Eclipse?
Antwort: Plugins, libraries in rep
Übergang von Ant zu Maven 2
Refactoring des Ant-Projekts. Projektstrukturen vereinfachen! Bei mehreren Artifacts in Unterprojekte aufteilen.
Auflösen der Abhängigkeiten. Verwendete Bibliotheken identifzieren (mit Version!) – das ist normalerweise der aufwendigste Punkt.
Einspielen von 3rd-Party- und Inhouse-Bibliotheken in internes Repository.
POM definieren. Spezielle Ant-Targets in mvn2 umsetzen. Weitere features nutzen, um Qualität zu steigern.
Beispiel: antAuthProject
/src und /test/src-Folders. /lib, /etc; client, common und server-Packages.
=> mvn: drei Verzeichnisse /server, /common, /client und eine pom.xml auf root-Ebene und jeweils in den drei Verzeichnissen. Sourcen darunter in /src/main (Mvn2-Konzept) und /src/test. Alles andere in /resources.
Auflösen der Abhängigkeiten: Gut, wenn Versionsnummer in jar-Namen enthalten sind.
mvn install:install-file, um Libs in Rep zu bekommen (für internes Rep).
Mvn-plugin für spezielle Ant-targets. <parent>-Tag für Submodule. Submodule erben Konfig des Hauptprojekts (z.B. Unit-Tests, CodeCoverage).
25. April 2007 von KG
Bridge building as metaphor for sw. Jack W. Reeves "What is sw design?"
Design: Sourcecode itself. Manufacturing incredibly cheap.
Design small parts, then bigger. Our design tool: Java. C/C++-origins.
Stupid Java Tricks: static block. 6 ways to initialize sthg. in Java.
Enum example.
Inner class inherits
List<String> s = new ArrayList<String>()
{
{ add("hi"); //etc.
Justin Gehtland.
Language entropy – languages tend to become more complex.
Java language is the design, Java platform the manufacture.
Jaskell, Scala – Functional languages – e.g. automatically thread-safe
More declarative than imperative code.
Paul Graham, Hackers and Painters. Scale of the power of languages. LISP as the most powerful predecessor – no language that goes so far, Java only 4 features, Groovy 6 (?), Ruby 7
Ruby example… Calendar cal; cal.2.days.fromToday…
Testing is the rigor of SW dev.
KGs Summary:
The most inspiring and personally important session which I attended. Neal Ford made clear that following the test-first-approach (and testing in general) is more needed than type-safety. And even more needed than the IDE (or whatever) is the programming language as developer’s tool. But what the programmer most necessarily needs is – his brain. If he doesn’t think but just rely in the compiler warnings etc. there is no gain at all. As Neal Ford explained that FUD very often distracts from thinking, his recommendation is to evaluate, I think, every Java developer should take a mid-complex personal project and rewrite it in Ruby.
But I’m also sure, many won’t. This is caused in the fact that there are many programmers which have no "personal project" – they even haven’t any IDE installed at home.
To me it seems, the programming world is not only splitted into MS and non-MS programmers or those who use a plaintext editor and those who use a full-featured IDE, but also in those who want to be efficient (in the Pragmatic Programmer’s sense) and those who just want to stay where they are. There is a big "gap of passion" and IMHO, the less a developer is passionated about software development the more she/he’ll produce and consume FUD.
Addendum: On Neal Ford:
Homepage: http://www.nealford.com/
Blog: http://memeagora.blogspot.com/
25. April 2007 von KG
Zu Rainer Jung: Tomcat-Commiter, Cluster, mod_jk, Geschäftsführer kippdata GmbH
Warm-Up-Fragen, etc. wer benutzt noch 1.3 etc,
Statistik XX-Optionen: 412 + 32 Diagnose
367 in DevBuild
53 Optionen mit verschiedenen Defaults
Beschränkung auf Sun JVM 1.4.2, 1.5, 1.6
Drei Fragestellungen:
- GC run blockiert Anwendung
- GC blockiert CPU Zeiten
-
Großes Memory ist teuer
=> Drei widersprüchliche Ziele.
Objekterreichbarkeit – lebt, wenn es Kette v. ObjRefs von "root" zum Obj gibt.
roots: static fields in Klassen, Args, MEmber der Methoden in allen aktuellen Threads.
Realisierungsziele
- schnelleObjAllokation: Eden-Stack; Ende d Stacks wird hochgesetzt -Inkrementierung d Pointers. Was, wenn Eden "voll ist"? Eden leerräumen: In Survivor Space () [=>Minor GC] wird Eden umkopiert. SS kleiner als Eden.
Was, wenn SS voll ist? Zwei SSes Survivor A + Survivor B. Eden=>A=>B. Dabei werden die From und To-Rollen immer abwechselnd vertauscht. Deshalb heißen die SSes auch "Semi-Spaces".
- New: Var 1: Eden+ 1 Semi-Space
- Var2: Eden + beide SSes.
- Was, wenn SemiSpace voll ist? Objekte nicht mehr "jung" – Tenured – enthält ältere Objekte. Nach MGC => Eden leer, From leer, alle Objekte in To und Tenured.
- Objekte im SS erhalten Alter "age", wird bei Umkopieren um eins erhöht; Objekte oberhalb eines Age-limits (default 31 (1.4.2), 15 (1.6) und 31/15 (1.5), änderbar) kommen nach Tenured.
- Suche letztes Age A, welches unter N% liegt.
- meisten Obj sterben jung
- wenig Overhead + Störung d. App
Schalter -server / -client Verändert Memory Defaults. 64 bit immer Server.
Server Class Detection: Linux: Anhand d Memory-Werts.
-X-Argumente sind nicht standardisiert. -XX:+/-[Schalter] -XX:[key=value]
Argumente an CL oder .hotspotrc oder _JAVA_PREFIC envvar
Heap: Eden+2*Semi+Tenure
Dynamisches Resizing. Defaults 40/70%
Für Produktion Xmx=Xms
New Size= Eden + 2*Semi
(Kein Schalter f. Tenured). New Size als Anteil New:Tenured = 1:NewRatio
New generation (in Doku): Ein Semi-Space + Eden
Survivor Ratio 1 Semi Space also New /(SurvivorRatio+2)
4 = Eden 4/6, SS 1/6
Tenuring-Verhalten beeinflussen
TargetSurvivorRatio (Zielfüllstand SemiSpaces %)
MaxTenurinbgThreshold
OutOfMemoryErrors
OnError – Kommandoübergabe.
Schalter ShowMessageBoxOnError: Hält Prozess an, damit man Debugger anklemmen kann.
Seit 1.4.2. parallele Minor GC (Throughput Collector). Concurrent: Abarbeitung während App nicht gestoppt wird.
Schalter UseParallelGC bei CMS UseParNewGC, Default ab 1.5 bei server
Anzahl benutzter Threads nach Formel
(ncpus <= ?) ncpus : 8 + (ncpus -8)* 5/ 8
ParallelGCThreads=x einstellen besser!
GC-Ergonomie, in Verbiindung m. Server-Class detection. Andere defaults der Mem-Größen.
UseAdaptiveSizingPolicy – soll Eden und SemiSpaces automatisch skalieren. Wohl weniger performant, zu prüfen.
Major GC / Full GC
Entfernung toter Objekte aus Tenured. Steht nicht in jedem Log. Tenured "voll"? Ganz unterschiedliche Ansätze Tenured-Size Eden – Size 1 Semi ODER 68% Tenured
System.gc() (aber kein Vertrag).
Webapp-Trick: <% System.gc(); %> – für Tests – ULR aufrufen.
GB-Tenured GC kann im Mehrsekundenbereich liegen; vor 1.6 single-threaded.
Zwei Algorithmen
Mark Sweep Compact (Exact GC), default:
Geht nicht nur durch, um tote Obj zu entfernen, sondern "defragmentiert" auch
ab 1.5.06/1.6
optionale parallele Abarbeitung – mehrere Threads Parallel!=Concurrent-Vorsicht!
Gleicher Thread Count
Concurrent Mark Sweep [CMS] GC (seit 1.4.2)
Anwendung nur kurz stoppen, GC in mehreren Phasen. UseConMarkSweepGC mit Minor GC nur mit UseParNewGC
Pausenzeiten deutlich kürzer. Anfangs sehr buggy, jetzt aber empfehlenswert.
Gefahr: Fragmentierung von Tenured. erhöhter Memory Bedarf in Tenured (~30%?)
Neu in 1.6: CMS auch für System.gc(), Schalter ExplicitGCInvokesConcurrent
Parallele Mark-Phase (stop)
1.4.2. ignoriert SurvivorRatio.
Class Garbage Collection;
Demo: Eden und JMeter sendet Requests byteArray allozieren Speicher.
jconsole zeigt Ansteigen der Belegung d Eden Space an.
Demo: Aging Distribution
25. April 2007 von KG
Verbindung HTTP + TC. http://tomcat.objektpark.org/index.html ProxyLoadBalancer Apache httpd – ist am Browser-bug-resistentesten.
Analyse mit Live HTTP Headers
Catalina Architecture: Non Blocking IO Handler. ThreadHandler von Session separat.
APR für NB
Z.B. 10.000 gleichzeitige Verbindungen auf derselben Box. Viele Verbindungen, die aber nicht alle gleichzeitig aktiv sind.
Tomcat-Pipeline intern: Datenströme werden "mundgerecht" zerlegt in Objektrepräsentationen.
Was, wenn ein Server nicht mehr ausreicht?
mod_jk -Konzept. Über httpd analysiert und an via Apache Java Protocol verbundene Tomcat-Instanzen. "Sauschnell" – stehende TCP/IP-Verbindungen, wie RPC.
jserv -Protokoll: Senden von Kommandos und Datenblöcken statt Stream mit Header und Body. Einziges Problem: 8k-Header-Beschränkung bei SSL-Verbindungen. Kann aber vergrößert werden, zu Lasten des allgemeinen Speicherverbrauchs.
2-Byte-Kodierung mit Header-Strings. 30%-40% Perfomancegewinn iVglz http_proxy.
mod_jk-Konfiguration
JKWorkerProperty (ies) setzen:
worker.list=loadbalancer,jkstatus
~node01.port=8009/host=lch/type=ajp13
~loadbalancer.type=lb
~.balance_workers=node01
worker.jkstatus.type=status
JkMount /jkstatus status
JkMount /myapps* loadbalancer
server.xml:
jvmRoute="node01"
protocol="AJP/1.3"
AJP im Einsatz
Real Connect: CPING-Paket hin, CPONG zurück
Request: RQ Header
Response: Nur wenn Requests beendet sind.
LogLevel Trace
Template
einmalige Konfiguration, auf die für viele Instanzen referenziert werden kann.
Timeouts
socket_timeout, connection_pool_~, connect_~, prepost_~, reply_~
Recovery +4 Recovery-mode: connection close after ERROR
3 – Lieblingsmodus von P.R.
Zähler-Methoden : Requests, Sessions (PR für statusbehaftete), Busy (kleinste Anzahl von Anfragen, von PR für statuslose Sessions), Traffic (kleinster r+w Traffic); nur Requests, die keine JSessionId erhalten haben.
LB-Algorithmus (PSEUDO-CODE)
DEF service
FIND <worker that handles request>
CALL_get_most_suitable_worker
IF EXISTS <worker candidate>
FIND <worker_endpoint>
IF EXIST <worker_endpoint>
SET WORKER.ATTR.state_busy
SET ATTR.lbvalue
IF LB.ATTR
[###von Folie holen!###]
Weiter mit FIND MOST SUITABLE Algorithmus
Weiter mit FIND BEST Algorithmen
Retries
Loadbalancer oder Worker
jk_status : Für Analyse zur Ermittlung des geeigneten LoadBalancers.
mo_jk State – Recoverable, Force Recoverable. JKRequestLogFormat – dezidierte Analysen.
Location Mapping. Eine Maschine liefert statischen Content aus. Loadbalancer immer nutzen, schon wegen jk_status.
Empfohlene Mindestkonfiguration: Zwei Rechner mit je zwei Instanzen (stabiler und updatefähig.).
Hot Standby -
Routing – Konfiguration: Szenario "Monatschabschlussbericht."reportlb zustandslos einrichten
Cluster-Session State – über Domainen hinweg. Nodes bleiben nicht gleich. State auf anderen Rechner auslagern.
Zellen – Distance: Auch zum Trennen unterschiedlicher Standorte weltweit.
Virtual Server via Direct Routing. LoadBalancer ändert Rückroute IPVS wird dadurch nicht zum Flaschenhals.
Tomcat APR Connector: Direkter OpenSSL-Support in Tomcat. Senden statischer Ressourcen mit OS sendfile (*ix); Viele KeepAlive – Verbindungskonstrukte jetzt möglich (z.B. für AJAX)IOPointer wird Poller zugewiesen.
ApacheBench – TestClient
IO ist derzeit der Performanceblocker, CPU nicht mehr. Größte Installation mit 80 Tomcat-Instanzen auf 30-40-Maschinen.
Weiterlesen ‘JAX 2007: Tomcat und Apache in der Produktion (Peter Roßbach)’
25. April 2007 von KG
„My Definition of
Web 2.0: 2 comes after 1“.
„Wikinomics“Tapscott/Williams
Challenges and Capabilities of Web 2.0
Single UI Framework approach.
Web 2.0 Services Architecture Diagram
Learn from Portals.
Different types of users. Enterprise
communities.
Social Networking Key Enablers –
Linking and tagging.
"Demonstration": Slides…
Sum up: Absolutely boring, just telling the obvious.
25. April 2007 von KG
Geschichte
Oracle-Schenkung (vormals Oracle ADF Faces). Incubator-Projekt beendet am 22.04.2007; jetzt Unterprojekt von MyFaces. Craig Mc Clannaghan Incubator Mentor.
Wiki
Komponenten
Ca. 105 Komponenten. HTML AJAX Renderkit.
Dialogframework. Testframework. Facelet-Unterstützung "out-of-the-box". Dazu sind die Maven-Facelet-Plugins erforderlich.
Tomahawk-Unterstützung. AJAX4JSF-, Seam-Unterstützung. Tobago schwierig.
tr:charts – SVG-Graphiken, ziemlich beeindruckend.
tr:breadCrumbs – "Hänsel u. Gretel-Navigation"
tr:document – individuelle Load-Manipulation.
tr:form – Anders als normal
tr:icon – Skin-Icon
tr:inputListOfValue action kann sich auf bestimmte Datei beziehen.
tr:inputSpinBox Zahlenwert in Mini-List, mit Tastatur änderbar
tr:legend – für Skin Icons
tr:navigationPane z.B. als Tab gerendert. Abstrakte Klasse aus dem Model überschreiben ("Swingy").
tr:navigationTree
tr:page – f. Grundstruktur d. Layouts
tr:panel – diverse Layout-Komponenten, Border-, Group-, Form-Layout (wie Layout-Mgr). (###?Tomahawk document?###)
tr:poll Fortschrittsbalken – ziemlich cool – partialTriggers="poll" setzen. So lange wie Transaktion nicht abgeschlossen, wird die Seite angezeigt. action="[Seite/Zustand nach Beendigung]"; Beispiel: Auch für regelmäßiges Pollen auf Daten möglich (z.B. Aktienticker). Auch z.B. zum Überprüfen aktiver Session.
tr:selectOne[...] – Zum Auswählen nur eines Elements (v.a. choice)
tr:selectManyShuttle – zwei ListBoxes mit Möglichkeit, Werte von einer in die andere zu übertragen.
tr:singleStepButton
tr:subform – Vorversenden von Formteilen
tr:treeTable
Table-Sortierung sehr einfach, ebenso Selektion.
tr:setActionListener (auch in JSF 1.2 default – für den Service Manager sehr interessant).
Projektstruktur
- trinidad-api
Basisklassen, abstrakte Klassen, Code nur für Trinidad-Entwickler interessant…
- trinidad-impl
- trinidad-build
JSF-Komponentenerstellung beschränkt sich auf das Schreiben lediglich der Rendererklasse (!). Facelets u.U. problematisch.
Framework
API. Vereinfachung der Komponentenerstellung. Dialogframework. Optimierte Komponentenspeicherung: UIXComponentBase benutzt direkt Map und delegiert Bean-Methoden.
Maven2-Plugins. TagDoc Personalisierung. Skinning-Dateien.
Dialogframework z.B: für Wizards. processScope zw. Request und Session. Events: launch und return.
HTML AJAX RenderKit
Partial Page Rendering. iframe anstelle von XmlHttpRequest-Objekt. Clientseitige Validierung, kein form.submit(). Wäre u.U. auch sehr interessant f. Service Manager.
autoSubmit – input Components f. action, partialSubmit – command, partialTriggers – für listener, bezieht sich auf partial/autoSubmit Komponente
PPR via Java API auch möglich (in action-Methode; RequestContext-Objekt von Trinidad nicht mit Faces-OBjekt verwechseln.).
RenderKit Extension – JS an Client senden (programmatisch).
RenderKit Skinning Architecture. CSS anlegen, registrieren in trinidad-config.xml und trinidad-skins.xml
Referenzieren auf Komponenten über Pseudoelemente, af|Komponente::Attribut { … }
Skinning-Verhalten über EL dynamisch änderbar!
Accessibility: default, inaccessible, screenreader (f. Blinde), right-to-left, debug-output
Demo-Anwendung http://code.google.com/p/facesgoodies.
Arbeiten mit Trinidad
Vergleich JSF-Standard ./. Trinidad. Sehr angenehm: tr-Tags mit anderen (f) einsetzbar.
JSF 1.2 nur im branch, wartet auf MyFaces update. Aber stable, mit "magic script" permanentes Merge, derzeit keine nightly builds, das Continuum derzeit down.
Gesamteindruck
Sehr mächtig, sehr traurig, dass das HTML AJAX RenderKit auf iframe basiert
24. April 2007 von KG
Learning, describing, tooling "The Eclipse way".
From closed to open – not only regarding OS, but also direct interaction with the dev team.
Project gives community and vice versa. "Village Effect" create accountability without blaming others. Transparency – who does what. Continuity (?) => continuous health.
Mindmap of Eclipse practices ###get###
Organizational Patterns of Agile SW Dev / Coplien ###get###
Bugzilla Pivotgraph demo.
EPF examples. Bottom-down-and-up-collaboration;
Process/practice awareness: Instead of writing documentation help on the tool level.First products 2 b released in 2008. "Open commercial" software – seems that Jazz’ll be fully commercial (hm, maybe as commercial as EPF is considering the "RUP composer").
Jazz overview. Team first – codesharing.
KG’s summary
Finally we can see something – after a long time of waiting (since http://portal.acm.org/citation.cfm?id=965670&coll=portal&dl=ACM&CFID=21208174&CFTOKEN=43773194 I’m eager to see more) there’s a clear concept. If I understood it correctly, the tool-suite shall only be released commercially
I hope this can be understood in the sense of never giving Eclipse for free or the RUP composer… I assume, there’ll be connectors to Lotus or Rational stuff – hope this’ll be a separate commercial part.
The vision I understood was this: One can design a collaborative process within EPF and apply it to Jazz-enabled IDEs in the way that it ensures that the developers stick to the process. This would work – plain documentation not.
24. April 2007 von KG
AOP:General Introduction
Comparison OOP and AOP. AOP 2 complement OOP. Don’t oversimplify.
Common vocabulary: Service layer – business service – data access layer – dao – repository – web layer. Also patterns.
(Speaks in a quite strange manner. Somehow I can imagine him ~20 years older with a long beard speaking the same way).
Mismatch between common vocabulary and implementation => solution is abstraction of the vocabulary and reduce every requirement to one code module.
No way to express the layer abstraction with a programming language like Java. Pointcuts do. E.g. service layer should be transactional.
Advices. @AfterThrowing (AspectJ 5). Good practice: Mention pointcut here (for reuse).
AspectJ 5 Expression language.
Argument binding, e.g. @AfterThrowing(throwing="hibernateException", pointcut="MyApp.dataAccessOperation()")
Aspects like classes, Advices live in Aspects.
<aop:autoproxy />-Switches AspectJ-support on.
AOP with Spring and Java < 1.5. E.g. for existing code. "Volatility" of pointcuts – stability of advices.
Spring 2.0: @Repository + DAO (? ###check annotation###)
ProceedingJoinPoint
Argument binding better than join point parsing; around advice needs 1st arg ProceedingJoinPoint.
Idempotent operations: Runtime.RUNTIME_RETENTION_POLICY arg. => ###read###
AspactJ language extension, e.g. public aspect SystemArchitecture {}
(Example requirement: no calls to the web layer). AJDT.
declare warning/error – example to check architectural rules even by preventing the programmer from compile the code.
Spring 2.0 integration – still AOP proxy. Mostly different pointcut definition language extended. Also along with Spring AOP.
=>openJPA ###check###
AspectJ for policy enforcement/exploration, infrastructure/domain
24. April 2007 von KG
Session war auf Deutsch, trotz des Titels.
Teaser: Showcase
Office demo: Mail, Bildverwaltung. Drag'n Drop-Beispiel.
GWT-Konzepte
Motivation – ajaxified -"nicht nur Anwendungen, die AJAX verwenden, sondern RC, desktop-ähnlich".
Neuer Ansatz: Java-only code. Kompiliert zu HTML, JS, CSS. GWT principles.
Components: UI library, Java2JS compiler; Language support < Java 5.
Hosted mode shell. JSNI. XML, JSON support. GWT designer.
Beispiel: Hello World
Project creator script. %GWT_HOME%projectCreator -eclipse GwtHelloWorld
NN
applicationCreator
Client-Klasse benötigt Client-suffix.
Hosted mode shell.
GwtHello.gwt.xml - Modulbeschreibungsdatei. /public-Verzeichnis enthält statische Elemente. <meta>-Tag in HTML und einbinden der JS-Datei.
Genauerer Überblick
Module
module descriptor, client subpackage (Java client code), public subpackage.
Widgets + Panels
Widgets: Eigentliche GUI-Componenten, listener (Swing-ähnlich?). Panels: Für Anordnung der Widgets. Composites aus mehreren Widgets. Selbsterstellung rein über Java.
RootPanel: Stellt Schnittstelle zu statischen HTML dar. CellPanels, an Swing Layout-Manager angelehnt. TabPanel und StackPanel. PopupPanel, DialogBox. Hyperlink-Panel: Stellt Punkt/Status der App dar (History Funktionsverlinkung nötig).
i18n
Eingebaut – drei Möglichkeiten, lokalized. Klasse pro Sprache. i18nCreator – Script mit Property-Dateien. Interface mit Methode; JavaScript-dynamischer.
RPC-CallsAJAX-calls gewrappt mit RCP-Idiom. Protokoll proprietär, Transport via JSON.
RemoteServiceServlet Implementierung. Servlet-Mapping, URL-Mapping enthält zusätzlich Pfadangabe.
ClientCall-Beispiel. onSuccess/onFailure.
Was kann man transportieren? Primitive, String, Date, alle Arrays der serialisierbaren Typen. LinkedList nicht unterstützt.
Userdefined Types. IsSerializable direkte Implementierung.
In-depth view
Customization
Drei Ansätze:
Ableitungen von UIObjects, Widgets.
Composite von mehreren Widgets.
JSNI – keword native – dann keine Java-Kompilierung. JS-Code darin auskommentiert.
Clientquellcode + Binärkode in jar. Jar im Classpath des GWT-Kompilers. Ggf. Launch-Konfiguration in Eclipse anpassen.
Wichtige Erweiterung: GWT-Widget-Library (Robert Hanson).
Viele interessante Widgets. Ferner: GWTSpringController. Bugfixes.
Evaluierung – Warum und wann an die Nutzung vom GWT denken?
JS und HTML selbst organisieren. Viele Nachteile.
JS Framworks verwenden. Dojo; Scriptaculous/Prototype. Langsam, schwierig, schlecht zu plflegen.
Echo2;
General Interface (Tibco) (+/DirectWebRemoting).
AdobeFlex2 / OpenLaslo/ XUL: Browserunterstützung sehr problematisch.
GWT
contra: Konventionen müssen erst erlernt werden; CSS zur Beschreibung de Widgets. fehlende Unterstützung von 1.5; kein MVC;
pro: In Java verbleiben, also Debugging, Unit-Tests etc. etc.
g4jsf-Integration der Komponenten in JSF.
Attlassian GWTDesigner. "Ohne JS läuft nichts".
24. April 2007 von KG
Objective/Background
Eclipse overloaded with information. E.g. Package Explorer in normal projects.
Context loss when multi-tasking. No integration with IDE workflow.
Demo
Eclipse "empty" except of task view. Hyperlinking also to sourcecode (### – need to check).
Search view – (### try with Trac).
Search for Duplicates when submitting a bug based on stack trace.
Collaboration
Template for commit messages. Mylar-teamrule: Never write your own commit message.
### Eclipse UI for only searching and submitting. ###
Planning
Focus on work week;
Schedule
2.0 June 29th (with Europa)
Background
Decrease-of-interest model. Both direct and indirect. Landmark/Interesting/Uninteresting.
Framework
Four different APIs. Look the docs.
Integration
Xplanner-Connector. IssueZilla; Rally Software; Code Beamer; DLTK Structure Bridge (supporting );
Tasktop-Demo
Task-based work also for office work. Unfortunately focussed on MS Office (and therefor MS Windows).
Default-Browser = Eclipse;
24. April 2007 von KG
Neue Herausforderung (?)
- Multi-Core Dilemma: Sehr aktuelle Diskussion; durch java.util.concurrent angefacht, JSR 166, ebenso durch Multiprozessorarchitekturen. "Krieg der Kerne" iX. Patrick Leonhard-Blog.
- Steigerung der CPU-Frequenz nicht alleinige "Performanceschraube".
- Nur linearer Anstieg d. Stromverbrauchs bei Mehrkernarchitektur, platzsparend.
- www.despair.com
- Zukunftsprognosen: Cache-Vergößerung sorgt weiterhin f. Beschleunigung. Concurrent-Software wird für Nutzung immer wichtiger.
Begrifflichkeit – "Mehrfädigkeit".
Multithreading iRv Java EE. Einzig EJBs sind per se threadsave. Servlet 2.4 macht SingleThreaded Modell deprecated – kein Verlass. Spring nur Data Access Templates, Business Services bleiben in der Entwicklerverantwortung.
Cincurrency Utilities, Doug Lea, mit Java 1.5 in java.util.concurrent berücksichtigt. Concurrent Collections, Executor Framework. Synchronizers (Semaphore, CountDownLatch, CyclicBarrier, Exchanger), Locks (Objektpräsentation von synchronized) und Conditions, Atomic Variables.
Collection-synchronied grobgranular, skaliert schlecht, Multicoreunterstützung fehlt.
synchronized Wrapper-Beispiel.
Threadsafe und Concurrent – Unterscheidung.
Veränderte Semantik – Iteratoren bislang fail-fast, jetzt "weakly consistent".
Java 6: ConcurrentSkipListMap; Collection Interfaces (ab 1.5): Queue, BlockingQueue, ab 1.6: Deque ("Double Ended Queue"), Blocking Deque .
Executor Framework – Task durch Runnable beschrieben; Submission – Executor; SingleMethodInterface;
ThreadPoolExecutor – Subklasse ScheduledThreadPoolExecutor
Executors – Utility-Methoden;
Starten und stoppen des ThreadPools. ExecutorService – Lifecycle-Verwaltung; ThreadPool
Life-Demo
24. April 2007 von KG
"Waterline" of recognizability – AT machines etc. etc. Historical walkthrough of the programmer’s toolbox development. More stuff gets unrecognized, holy grail is natural language development (Star Trek).
Some Sun marketing. Tools: Especially NetBeans 6 MR – Ruby support, even Rails "out of the box", also PHP. Code completion.
Called himself “Mr. NetBeans”. Wouldn’t reflect my style.
23. April 2007 von KG
Einführung
Axis 1 – Retro; u.a. in WAS integriert, Inkompatibilitäten;
Axis 2 – Anforderungen geändert, nicht mit Axis 1 erreichbar; WS-Security; Performance; 3rd Generation WS Framwework; andere XFire, MS Indigo;
Axis 2 mit asynchronem Modell; MEP – Message Exchange Pattern; Pull-Parser / StAX; Unterschiedliche Data Bindingmöglichkeiten; MTOM/SwA Attachments; WSDL 2.0;
Handlerketten dynamisch; Hot Deployment/Hot Update f. Services; Modularisierungsfähigkeit;
Erläuterung Streaming-Parser vers. DOM-Parser; Push (z.B. SAX) vers. Pull Parser; StAX – Streaming API for XML
Axiom
eingeständiges Projekt, wrappt StAX;
Simuliertes baumbasiertes Parsing; "deferred building"; in Wirklichkeit Stream-Parser im Hintergrund;
Spez. SOAP-API;
Service Archive
*.aar; neues Deploymentmodell; Ant-, Eclipse-Unterstützung; META-INF muss zumindest services.xml enthalten, normalerweise auch die WSDL-Dateien.
Repository
Ein R. für jede Axis-Installation; Standalone-Services möglich; HTTP;TCP;SMTP/JMS-Listener; zwei Ordner: services (…) und modules (Erweiterungen);
Automatischer REST-Support (muss gesondert disabled werden).
Änderungen in Axis-Konsole nicht persistent, also nicht für Produktivbetrieb geeignet! Änderungen müssen in Service-Archiven vorgenommen werden, um persistent zu sein;
XML Data Binding
- ADB (Axis D.B.); Default;
- XMLBeans;
- JiBX;
- JaxME;
- JAXB-Reference Implementation;
Entscheidender Einfluss auf Gesamtperformance; ggf. auf DB-Framework verzichten;
Axis2-Engine
SOAP-Request (HTTP)
=>AxisServlet~MessageContext-MC_req~
=>AxisEngine~H1…n (Message Handler, weitergeben, transformieren, filtermäßig)~[end in-flow]
=>MessageReceiver (ruft WS auf, dieser kann alles durch Java Aufrufbare sein; leicht selbst zu implemetieren)
=>WS-Aufruf
=>MessageReceiver (weiß um Synchronitätsinformationen)~MC_resp~
=>[falls Antwort]: neue AxisEngine-Instanz[start out-flow]~H1..n~neu
=>Transport Sender->MC_resp
=>AxisServlet
=>SOAP response
Frage: Muss Factory für Identifzierung des Clients erstellt werden (im Message Receiver)? Antwort: Letztlich über Message Context
Axis auf Clientseite
OutInAxisOperation: Verwaltet MC_req und _resp; Vier Flows für Frage/Antwort; Komplementäre Handler; Konfigurierbar, nicht programmatisch, Beispiel: Verschlüsselung.
Phasen
• Eine Phase ist
• Handler sind mit Regeln verknüpft
- In welche Phase soll der Handler kommen?
- Soll er erster Handler einer Phase sein oder letzter?
- „Handler A immer vor/nach Handler B ausführen“
• Standard-Phasen:
Transport, Security, Pre-Dispatch, Dispatch, Policy Determination
• Konzept erlaubt dynamische Anordnung von Handlern
Module
- Gruppieren Menge von Handler;
- Separat deployed (*.mar);
- Beispiele für Module; Z.B. Transformation älterer Nachrichtenstrukturversionen. SOAP-Monitor.
- Engaging-Konzept – Modul wird für bestimmte Services/Service Gruppen aktiviert;
Client-API
AXIOM-basiert; RPC-Kommunikation unterstützt; Dual protocol transport in request + response; WS-Addressing support; echte Asynchronizität;
Code-Generierung
Derzeit: Java, C#, C++. XML-Darstellung von Konfiguration und WSDL. Ant-Unterstützung. Java2WSDL (…). Maven2 bald. WS-Policy basierte Erweiterungen. Lifecycle-Management (f. Inbetriebnahme etc.).
JAX-WS + Annotations. JSON.
Entwicklungsbeispiel
Code-first (Implementierung zuerst) / Contract first (WSDL/Schema zuerst). Problematisierung des Code-first-Ansatzes. Arbeit von WS-I unterstützt Interoperabilität besser, deshalb geringeres Risiko. Hinweis: Generierte WSDL-Datei mit WS-I-Tools prüfen!
POJO-Beispiel
- POJO programmieren.
- Service-Konfigurationsdatei schreiben (services.xml).
- Service-Archiv erstellen.
- Deployment.
RPC-Message-Receiver f. POJOS. Bestimmte Methoden können ausgeschlossen werden (in services.xml, excludeOperations-Tag). Dateiname d. Service-Archivs bestimmt den Namen.
Einfaches Beispiel. Besondere Lektion: Überschreiben der Methoden nicht möglich, keine Polymorhpie.
Document-Style sollte vorgezogen werden. RPC über Reflection. Document-Attribut allgemeiner, deshalb nur scheinbarer Widerspruch, das Struktur RPC entspricht.
Target-Namespace kann festgelegt werden.
invokeBlocking (RPCClient): synchroner Aufruf. RPCInOnlyMessageReceiver.
Services und Service-Gruppen
Gruppen – einfacher zu deployen. Kommunikation unter Services möglich. Dateiname des Servicearchivs: Jeder Service hat ein Name-Attribut. Dateiname = Name der Service-Gruppe.
Code-Generierung
WSDL2Code-Optionen (Übersicht); Eclipse-Plugin lässt nicht alle Kommandozeilenoptionen zu.
Session-Verwaltung
Handler/Phasen/Module
Weiterlesen ‘JAX 2007 – Hands on Apache Axis (Thilo Frotscher, Marc Teufel)’
6. Juni 2006 von KG
Ein wenig Eitelkeit: Die Dokumentation, dass ich beim JAX Jogging teilnahm. Unvergesslich wird mir der schnaufende, stämmige, aber blitzschnelle kleine Wiesbadener Männertypus sein, ebenso meine "Fehlleitung" hinauf zum Schlossberg, die zeigt, dass auch orientierungslos Gipfel erstürmt werden können…
10. Mai 2006 von KG
In äußerst unterhaltsamer, hellwacher Art führte Angelika Langer, bekannt aus ihren Artikeln im Java (?Objekt) Spektrum (mit Klaus Kreft), in die Programmierung mit Generics ein.
Geduldig und amüsant ging sie auf alle Fragen aus dem Publikum ein, das ihr schließlich den Code für eine einfache Pair-Klasse diktieren sollte. Echtes Highlight, sehr beeindruckende Person.
10. Mai 2006 von KG
AJAX support: Currently only mozilla (Rhino, JSLint) ATF deployment: Problem with 3rd party code: Why not – at least – providing the interested with a Maven task? ~ FU: Memory usage in status bar: plugin name? ~ Snippet use vers. code duplication.
10. Mai 2006 von KG
? Kritische Größen für Einführung: 2 Leute wohl nicht. Unklar. ?
Kein zentrales BO-Model über die ganze SOA verteilen (Auffassung Josuttis).
Dagegen Völker: Mindstumfang an zentralen Datentypen muss vorhanden sein, damit SOA in Großunternehmen überhaupt funktioniert. ~ E. Wolff stark hanseatisch gefärbtes, M. Völter stark schwäbisch/badisch.
10. Mai 2006 von KG
Nur Notizen: Empfehlung: Michael Feather (?) Working effectively with Legacy Code Architectural smells -> große Refactorings.
Characterisierung, best Practices. Teamdiskussionen -> Plan -> Umleitungen: deprecated begünden (!) Safe points definieren.
9. Mai 2006 von KG
Viele Überlappungen mit der Struts-/JSF-Session zuvor. Nichts neues.
9. Mai 2006 von KG
High-Level gehaltener Vergleich zwischen Struts (1.3) und JSF. Eher eine Einführung in JSF, großes "Ahaa" bei vielen, die sich offenbar noch nicht den Studio Creator angeschaut haben. Einige interessante Details zu Shale und ein paar Worte zu SAF 2.0 (Merger mit WebWorks.). Insgesamt sind die Sessions doch weit trivialer gehalten, als ich erwartet hab.