Archive zu Kategorie 'Konferenzen'

berlin.jar 2008

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.

 

JAX 2007: Spring Framework: Enterprise Java ganz einfach! (Eberhard Wolff, Mike Wiesner, Interface 21)

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. AdvicesPointcuts. 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.

JAX 2007: Testing with Selenium (Neal Ford, Thoughtworks)

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 | &nbsp;

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.

JAX 2007: Facelets und JSF (Thomas Spiegl, IRIAN.at)

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.

JAX 2007: Grails – Rapid Web Application Development (Sven Haiges, Actionality)

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)

JAX 2007: Maven 2 – Umstellung eines Projekts von Ant zu Maven 2 (Oliver Stauss, eXXcellent solutions)

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).

JAX 2007: Polyglot Programming (Neal Ford, ThoughtWorks)

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/

JAX 2007: Garbage Collection – Memories are made of this (Rainer Jung, kippdata)

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:

  1. GC run blockiert Anwendung
  2. GC blockiert CPU Zeiten
  3. 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

JAX 2007: Tomcat und Apache in der Produktion (Peter Roßbach)

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.
ZellenDistance: 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)’

JAX 2007: Keynote: Bringing Web 2.0 in the Enterprise (Rahul Patel, Oracle)

„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.

JAX 2007: Apache Trinidad – JavaServer Faces Erster Klasse! (Matthias Weßendorf, Oracle Corp.)

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

JAX 2007: Keynote From Eclipse to Jazz (Erich Gamma)

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.

JAX 2007: Simplifying Enterprise Applications with AOP and Spring 2.0 (Rod Johnson, Spring Lead)

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

JAX 2007: GWT – Creating ajaxified web applications with ease (Jens Nixdorf, Christian Bien, prodyna)

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".

JAX 2007: Mylar – The Task Focused UI (Mik Kersten, Mylar Lead)

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;

JAX 2007: Multithreading im Zeichen von Mehrkernprozessoren (Steffen Schluff (OiO), Patrick Garcia Taboada)

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

JAX 2007: Keynote Tim Boudreau

"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.

JAX 2007 – Hands on Apache Axis (Thilo Frotscher, Marc Teufel)

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

  1. POJO programmieren.
  2. Service-Konfigurationsdatei schreiben (services.xml).
  3. Service-Archiv erstellen.
  4. 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)’

JAX 2006: Jogging

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…

JAX Jogging 2006 featuring KG.

JAX 2006: Angelika Langer: Mob programming session: Java Generics

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.

JAX 2006: Jochen Krause: Eclipse Webtools 1.5 and AJAX

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.

JAX 2006: SOA Kontrovers (Fragestunde mit N. Josuttis, M. Völker, E. Wolff)

? 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.

JAX 2006: Merciless Refactoring mit Eclipse (II)

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.

JAX 2006: Keynote Craig Mc Clanahan: Future of Web Frameworks

Viele Überlappungen mit der Struts-/JSF-Session zuvor. Nichts neues.

JAX 2006: Craig Mc Clanahan: Struts and JSF

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.