JAX 07: Apache und Tomcat 6

Workshop, Peter Roßbach @ JAX ’07, Wiesbaden + + +

Integration in Maven: Projekt Cargo

News in Tomcat 6

  • Support für Servlet 2.5 und JSP 2.1 API’s
  • Apache 2.0 Lizenz
  • Neue Connectoren (NIO)
  • Reduktion der Abhängigkeiten, Vereinfachung der Verzeichnisstrucktur
  • Neue JSP Engine (w/ JSF)
  • Coyote Connectoren optimiert: Verbesserung der Performance, Mod_JK 1.2.22, Native Connectoren im Tomcat >= 5.5.17
  • Erleichterung der Administration (JMX 1.2)
  • Einsatz des Eclipse 3.2 Compiler (JRE ready mit Java 5 JDT) – schneller, kleiner, besser handlebare Lizenz

Tomcat

  • jsvr – Wrapper für Tomcat, funktioniert wie Watchdog
  • Security Manager – steuert Zugriff auf Systemressourcen

App Reload (während der Entwicklungszeit)

in context.xml: Resources Monitoring:
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

  • Logging seit Tomcat 6.x
  • neues API
  • neues layout der Konfig Datei

Ports

  • 8080 – http
  • 8443 – https
  • 8009 – ssl
  • 8005 – shutdown
  • 9000 – JMX-Apdaptor http
  • 1099 – JMX-Apdaptor rmi
  • 0900 – JMX-Apdaptor iiop

Tomcat Pipeline

  • Server > Service > Engine > Host > Context > Wrapper
  • jeder Übergang wird mit einer Pipeline verbunden. An den Pipelines können Valves angeflanscht werden

Infos über den Tomcat & Server

  • Tool: Lambda Probe
  • Link: http://www.lambdaprobe.org
  • >> lambdaprobe.org: „Lambda Probe (formerly Tomcat Probe) is a self sufficient web application, which helps to visualize various parameters of Apache Tomcat instance in real time. Lambda Probe is designed to work specifically with Tomcat so it is able to access far more information that is normally available to JMX agents.“
  • Umfassende Infos über Tomcat, Apps, JVM…
  • noch keine vollständige Unterstützung von Tomcat 6.x (Stand: 2007-04-27)

Protokoll-Handler austauschen

  • in der server.xml wird das Protokoll gegen eine Klasse ausgtauscht, die das Protokoll implementiert

<Connector port=“8080″ protocol=“org.apache.coyote.http11.Http11NioProtocol“
connectionTimeout=“20000″
redirectPort=“8443″ />
<!–
<Connector port=“8080″ protocol=“HTTP/1.1″
connectionTimeout=“20000″
redirectPort=“8443″ />
–>

Arbeiten mit mod_jk

  • Eigenen conf-Datei in httpd.conf includen:

<IfModule !mod_jk.c>
LoadModule jk_module „modules/mod_jk.so“
</IfModule>
JkShmFile „logs/mod_jk.shm“
JkLogFile „logs/mod_jk.log“
JkLogLevel info
JKWorkersFile conf/workers.properties
JKWorkerProperty worker.list=loadbalancer,jkstatus
JKWorkerProperty worker.node01.port=8009
JKWorkerProperty worker.node01.host=localhost
JKWorkerProperty worker.node01.type=ajp13
JKWorkerProperty worker.node01.domain=d10
JKWorkerProperty worker.node01.lbfactor=4
JKWorkerProperty worker.loadbalancer.type=lb
JKWorkerProperty worker.loadbalancer.balance_workers=node01
JKWorkerProperty worker.jkstatus.type=status
JkMount /jkstatus jkstatus
JkMount /example* loadbalancer

Tipp: Template verwenden wenn viele Nodes im Einsatz sind:

JKWorkerProperty worker.template.type=ajp13
JKWorkerProperty worker.template.connection_pool_timeout=300

JKWorkerProperty worker.node01.lb.balance_workers_node=node101
JKWorkerProperty worker.node01.reference=worker.template

thanks to Peter Roßbach! Great work!

JAX 07: Java 6 SE

Java 6 SE kommt bereits mit

  • Derby. Funktionen für Stammdatencache etc find also bereits vorhanden.
  • JNLP (WebStart)
  • Scripting Support
  • Remote Monitoring der JVM ist über Netzwerk bereits vorhanden (Java Monitoring an Management Console)
  • JPA kann vom Glassfish-Projekt verwendet werden (2 jar’s). Die direkte nutzung von JDBC wird nicht mehr benötigt
  • java.util.logging reicht für clientseitiges Logging aus.
  • java.util.concurrent: ein einfacher Thread-Pool
  • java.rmi: Remothe Method Invocation: einfaches Kommunikationsprotokoll für Client-Server-Kommunikation
  • java.util.ServiceLoader – sucht nach implementierungen eines Interfaces (from meta-inf/services) -> eigenen Wrapper für ServiceLoader bauen (S.13)
  • java.beans.XMLEncoder und java.beans.XMLDecoder – ein einfacher Web zu persistenten Beans! Allerdinsg sind keine Beziehugen zwischen Objekten möglich
  • java.util.preferences – Zurgiff auf Windows Registry

JMX

  • wurde entwickelt um Management- und Monitoring-Funktionen anzubieten
  • ist in Java 6 SE enthalten. JSR 3 stammt genu genommena us dem Ahr 2001…
  • beziet sich auf ein zu definierendes Objekt, weches Daten veröffentlicht. Dieses muss „nur“ registriert werden…
  • Registrierung im MBeanServer
  • Achtung: eine MBan darf nur ein mal registriert sein, ansonsten wird eine Exception ausgelöst

RMI

  • Remote Method Invokation

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface HelloWorldService extends Remote{
public String helloFromServer(String greeting) throws RemoteException;
}

  • Server benötige eine Klasse mit main Methode (aslo qusi der Server)
  • Client: fragt über Naming.lookup(„rmi://adress“) Service ab

Scripting Integration

  • Vorteile: kann schneller sein in Entwicklungszeit und Ausführung
  • Fluid Kernel: Fragmente können dynamisch nachgeladen vwerden – während der Laufzeit!
  • JSR-233 (scripting fo the Java Platform)
  • Zugriff von den Scriptsprachen auch die Java-Libs möglich!
  • siehe Package javax.scripting

ScriptEngineManager engineManager = new ScriptEngineManager();
scriptEngine = engineManager.getEngineByName(„JavaScript“);

  • in Java 6: JavaScript hat zur Zeit eine wesentlich höhere Ausführungsgeschwindigkeit als Groovie (etwa Faktor 10!)

JPA

  • vollkommener Verzicht auf DAO’s!
  • DAO’s nur für Stored Procedures zwingend notwendig
  • Eclipse DALI zur generierung von JPA aus RDBs

SWING

  • Andere Themes / Layout Manager verwenden
  • Matisse GUI Builder
  • großer Performancegewinn in Java 6! Außerdem: Java Swing erhält eine native Unterstützung in Windows Vista, was die Ausführungsgeschwindigkeit nochmals wesentlich erhöhen wird!

thanks to Adam Bien! (adam-bien.com)

JAX 07: Web Services mit JAX-WS

Idee

  • Vereinheitlichung der verschiedenen aktuell genutzten Herangehensweisen (AXIS, Fire, RI,…)
  • Interoperabilität mit Fremdsystemen (.NET)
  • State-of-the-Art Model für die Entwicklung

Historie

Object / XML Mapping

  • mittels JAXB (2.x)
  • hohe Performance
  • ebenfalls auch als einzelnes Projekt verfügbar
  • > http://jaxb.dev.java.net

WSDL to Service

  • Ausgangspunkt WSDL, Skeleton bauen, Annotation @WebService(endpointInterface(name=“AddNumbersPort“))
  • Deploy 1: Klasse Endpoint; Methode publish. Integriert in JAX-WS
  • Deploy 2: über JAX-WS im Web Cotainer, com.sun.xml.transport.http.servlet WSServlet – für „spezielel „Wünsche, zB Load Balancing
  • Deploy: interner Server für Service Deployment
  • Deploy: main-Methode + Endpoint.publish(„http://localhost:8080/addnumbers“)
  • Nutze Annotatins für Konfiguration! @WebMethod, @WebResult, @RequestWrapper…
  • Aufruf wie gewohnt über http://localhost:8080/addnumbers?wsdl

WAX-WS Handler

  • Logical Handler – Unabhängig vom Protokoll, Zugriff auf Nachrichteninhalt
  • SOAP HAndler – Zugriff auf vollständige Nachricht + SOAP HEader

Remote Persistent Objects

  • Client <-> Hibernate JPS Service <-> POJOs
  • Annotationen: @Stateful @WebService @Adressing
  • Zugabe Annotation: @Entity = JPA! reicht aus für die Kennzeichnung als persistentes Objekt

JAX-WS und Java 6

  • kein ANT Task vorhanden. Wenn Einsatz mit ANT geplant muss die Standalone-Version verwendet werden
  • meist ältere Versionen. Bei der Erstellung von JRE’S wird jeweils der Snapshot des JAX-WS-Repositorys verwendet, was bei aktueller Entwicklungsgeschwindigkeit schnell outdated sein kann
  • Update über Java Extensions Mechanismus möglich
  • Besserung in Java 7 (Modulkonzept) in Sicht (?)

thanks to Andreas Holubek! Great!

JAX 07: Bitte kein torrent laufen lassen

Moin Notebookbenutzer! Hat da jemand seinen Emule oder bittorrent noch am laufen? Das WLAN ist heute extrem lahm und die Latenzzeit liegt irgendwo bei 2,5 Sekunden(!). In Saal 1 sind gut 80 Notebooknutzer, weit weniger als bei anderen Sessions. Und bislang hat die Infrastruktur ja wunderbar funktioniert. Also: Emule @ home, Blog @ JAX 🙂

JAX 07: Session: Apache Derby

Geschichte

Die Software wurde ursprünglich von der Firma Cloudscape Inc., in Oakland, Kalifornien unter dem Namen JBMS entwickelt. Die erste Version wurde 1997 veröffentlicht. Das Produkt wurde später in „Cloudscape“ umbenannt.

1999 wurde Cloudscape von der Firma Informix Software Inc. gekauft, deren Datenbanksparte 2001 von IBM übernommen wurde. 2004 übereignete IBM die Cloudscape-Software der Apache Software Foundation unter dem Namen „Derby“ als OpenSource Software.

2006 wurde Derby als Java DB in Java 6 integriert.

Benefits

  • Einfache Installation, Handhabung, Nutzung, Entwicklung
  • Embedded Database
  • Plattforumunabhängig
  • keine (aktive) Administration (Admin via JDBC)
  • small footprint (ca 2mb)
  • kostenlos (Apache 2.0 License)
  • ODBC Support

Apache Derby <- IBM Cloudscape

  • JDBC-Driver by IBM (ODBC driver for free)
  • support by IBM
  • graphical installer by IBM (doh!)
  • samples, documentation (multilaguage), errorcodes by IBM
  • same sourcecode! IBM copies souce code and use it for own product build(!)

Overview

  • embedded? runs in the VM
  • embedded? (2) embedded jdbc driver
  • transaction support
  • multi-user, multiconnection, thread safe
  • deadlock detection
  • crash recovery / backup / restore / softupgrade
  • multiple database instances
  • encryptet databases – use Blowfish, DES, AES etc as you like (!!!)

SQL Language Support

  • completly support SQL 92 / 99 / 2003 (!)

Tools + Size

  • derby.jar: 2mb
  • derbytools.jar
  • derbynet.jar
  • derbyclient.jar
  • memory usage: ca 4 MB Heap

Limitations

  • no support for multiprocessors
  • database ist only one directory
  • 20-30 simultanous connections
  • 100-500 updates per second

Installation

  • just only put derby in the classpath…
  • myDB / services.properties: config file für database
  • use derby.properties for autorizing, authentification
  • Usage / Connection
  • URL: jdbc:derby:mydb;user=someuser…..
  • jdbc:derby:shutdown -> stop database
  • jdbc:derby;upgrade=true -> update db for new version
  • backup: copy the directory

Tools

  • Eclipse W/DTP
  • tools: sysinfo, ij, dblook

Usage

  • ab Java 6 (java 1.6.0) bruach der Classloader nicht mehr verwendet werden. Der Treiber wird bei angabe des Connection Strings automatisch geladen.

Links:

  • http://db.apache.org/derby/
  • http://db.apache.org/derby/quick_start.html

thanks to Frank Pienta 

JAX 07: Session: Apache Tomcat

Konfig Apache:

  • httpd.conf: „Include conf/mod_jk.conf“
  • mod_jk.conf: Definition der Worker, Tomcat-Nodes etc

Konfig Tomcat:

  • server.xml: connector-Tag, Properties port=“8009″ + protocol=“AJP/1.3″
  • > Angabe der Engine-Name + jvmRoute zur Erkennung, Load Balancer kann so eine Session immer mit dem gleichen Node verbinden

… many hand written stuff…

Links:

thanks to Peter Roßbach! (www.objectpark.de)

JAX 07: individuelle Kältesteuerung!

ich wurde erhört! Heute kam vor der ersten Nachmittagssession tatsächlich jemand vom Orga-Team und hat nach dem Wohlbefinden des Auditoriums gefragt. Toll & gut zu wissen dass sich die Nackenverspannung wenigstens dynamisch modulieren lässt *gg* . Hier noch schnell das Klima in Wiesbaden: draußen: ca 30 Grad = definitiv zu heiß. Drinnen: optimal!

JAX 07 ist Hype-Anfällig.

Auf der JAX wird nun auch noch professionell gepokert. Was finden die Leute nur am Glücksspiel? Es gibt so schöne viele Spiele, aber alle Welt will wohl gerade pokern. Aber so ist das wohl in dieser schnellebigen Welt: es wird (planlos) auf jeden Hype aufgesprungen, und da wir Developer ja nun schon jeden Java-Hype mitnehmen und ausschlachten, ist es vielleicht auch naheliegend dass der Poker-Hype mitgenommen wird.

Der Spaß findt also am Mittwoch um 20:30 (?) auf der JAX statt. Ohne mich.

JAX 07: Session: Apache Trinidad – 1st Class JSF

Trinidad ist ein Framework

  • Render Kit für HTML + Ajax
  • Beinhaltet Dialoge, optimierte Komponentenspeicherung
  • Maven 2 Faces – Plugin
  • Personalisierung / Layout-Anpassungen
  • Skinning: CSS-Eigenschaften

Historie

  • Trinidad wurde ursprünglich von Oracle geschenkt
  • Eingliederung in Apache MyFaces
  • Seit Sonntag, 22. April 2007, nicht mehr im Inkubator! Trinidad ist nun eine „offizielle“ Apache MyFaces Komponentenbibliothek
  • Lizenz: Apache 2.0

Neuerungen in Trinidad

  • Menu Model Abstraction
  • Maven 2 Faces Plugin
  • >> generiert Komponenten, Tags, XML-Files
  • Unterstützung von Facelets
  • CSS-Styles / Skinning ist möglich
  • Personalizaton Framework ist enthalten

Core Components (not complete)

  • tr:breadCrumbs – Navigation
  • tr:chart – Diagramm (wird vollständig per Vekorgrafik gerendert!)
  • tr:chooseColor – Farbeingabe
  • tr:chooseDate – Datumseingabe
  • tr:document – Seitencontainer, generiert die Elemente html, body und form.
  • tr:goButton & tr:goLink – Buttons / Links ohne Navigation
  • tr:icon – Skin
  • tr:image – Bild
  • tr:importScript – Script Imports
  • tr:inputFile – Upload
  • tr:navigationPane – Tabs, Bars oder Buttons als Navi-Leiste
  • tr:objectMedia – Multimedia-Inhalte
  • tr:inputNumberSpinbox – rauf/runter Pfeile, min / max-Values
  • tr:page – Layout
  • tr:panel* – verschiedene Layout- udn Visualisierungskomponenten
  • tr:poll – nutzt tr:progressIndicator, Partals Reload der Seite, progressIndicator triggert tr:poll und erzeugt Updates der Daten, tr:poll besitzt timer und bringt Daten ins GUI. „PPR“: Partial Page Rendering
  • tr:select* – Vielzahl an Auswahl-Komponenten
  • tr:seperator – Seperator (zB in Menüs, Select-Comps…)
  • tr:table – Table, mit Scrolling bereits enthalten
  • tr:train – Rendert Navigation
  • etc

Verwendung von PPR (Partial Page Rendering)

  • autoSubmit – für input-Komponenten, um eine action abzufeuern
  • partialSubmit – für command-Komponenten (link / button)
  • partialTriggers – für listener, beziehen sich auf eine Komponente (connect per Properties id / partialTriggers)
  • Alternativ: eine gewöhnliche Komponente in einem Poll ( tr:poll ) einfassen.

Dialog Framework

  • dialog:wizard, useWindow-Attribut setzen
  • Darstellung der Seite (nach Request) per Navi-Regel in einem eigenen (Browser-)Fenster

Links:

  • Sample App: http://code.google.com/ …trinidad

thanks to Mathias Weßendorf 🙂