OpenProj 2.1: freies Projektmanagement – neue Version veröffentlicht

Eine Alternative  zu Microsoft (R) Project gibt es nun aus dem Open-Source-Lager. Die Firma Projitiy hat heute eine neue Version der Software „OpenProj“ veröffnelticht. Das Programm arbeitet ähnlich wie MS Project und kann offenbar sogar die Project-Dateien lesen. Ein erster Test verlief sehr vielversprechend, auch wenn an einigen Stellen wohl noch Nachholbedarf besteht.

OpenProj ist in Java geschrieben und somit auch für Mac- und Linux-Nutzer interessant.  Die Software ist auf sf.net gehostet und kann unter http://sourceforge.net/projects/openproj/ geladen werden.

Apache Tomcat und mod_jk / ajp13 auf SuSE Linux

Nach wie vor ist der Apache Httpd schneller als ein Apache Tomcat, wenn es um die Auslieferung von statischen Inhalten geht. Gerade in Verbindung mit Tomcat bietet der Apache Httpd noch weitere Vorteile: durch das Modul mod_jk kann eine ganze Farm an Tomcat-Servern per Load Balancer angeschlossen werden!

Für den Betrieb benötigt man:

  • einen funktionierenden Apache Httpd-Server
  • einen funktionierenden Apache Tomcat-Server
  • das Modul mod_jk, welches auf der Tomcat-Webseite zum download erhältlich ist

Das Modul habe ich zur Vereinfachung nach dem Download in „mod_jk.so“ umbenannt und im Lib-Verzeichnis des Apache Httpd abgelegt (auf SuSE Linux 10.2: /usr/lib/apache2).

Der Apache Httpd ist auf SuSE Linux so konfiguriert, dass alle Dateien, die auf *.conf enden und in /etc/apache2/conf.d liegen, automatisch zu httpd.conf (bzw default-server.conf) included werden. Das macht die weitere Konfiguration einfach, denn nun müssen in dem o.g. Verzeichnis nur zwei Konfigurationsdateien abgelegt werden.

Die Datei tomcat.conf bindet mod_jk ein:

# Load mod_jk module
# Update this path to match your modules location
LoadModule jk_module /usr/lib/apache2/mod_jk.so
# Declare the module for <IfModule directive> (remove this line on Apache 2.x)
#AddModule mod_jk.c

# Where to find workers.properties
# Update this path to match your conf directory location (put workers.properties next to httpd.conf)
JkWorkersFile /etc/apache2/conf.d/workers.properties

# Where to put jk shared memory
# Update this path to match your local state directory or logs directory
JkShmFile /var/log/apache2/mod_jk.shm

# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile /var/log/apache2/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel debug

# Select the timestamp log format
JkLogStampFormat „[%a %b %d %H:%M:%S %Y] “

# Send everything for context /examples to worker named worker1 (ajp13)
JkMount /application/* worker1

In der Datei müssen ggf. die Pfade zu mod_jk.so sowie zu den Log-Files angepasst werden.
Mit JkWorkersFile wird auf die Konfigurationsdatei des mod_jk referenziert. Alle Anfragen im Format http://www.domain.tld/application werden nun an mod_jk übergeben.

Die Datei workers.properties ist – sofern nur ein einziger Tomcat-Server angebunden werden muss, sehr kurz:

# Define 1 real worker using ajp13
# this coud be al list in the format
# worker.list=worker1, worker2, worker3, worker4
worker.list=worker1

# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

Das Format zum Konfigurieren der einzelnen Worker ist also worker.<workername>.<property> . In der Beispielkonfiguration wird also nur ein Worker mit dem Namen „worker1“ genutzt, der auf dem gleichen Host läuft und mittels dem Protokoll ajp13 angesprochen wird.

Über die URL http://www.<domain>.<tld>/application erreicht man nun also direkt die Application auf dem Tomcat.

Quellen & weiterführende Links:

Java: Runden und Formatieren

Eine häufige Aufgabe ist das Runden von Zahlen. Java stellt hier bereits einige Funktionen bereit, die ich in diesem Artikel kurz vorstellen möchte:

einen Double-Wert auf maximal 2 Nachkommastellen runden:
java.lang.Math:
myDoubleRounded = Math.round( myDoubleValue * 100. ) / 100.;

einen Double-Wert auf genau 2 Nachkommastellen runden + Konvertierung zu String
import java.text.DecimalFormat;
DecimalFormat df = new DecimalFormat(„0.00“);
String myFormattedString = df.format(myDoubleValue);

einen Double-Wert auf genau 2 Nachkommastellen runden, deutsche Formatierung verwenden  + Konvertierung zu String
import java.util.*;
DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMAN);
df.applyPattern(„#,###,##0.00“);
String myFormattedString = df.format(myDoubleValue);

Java-Prozesse auf der Linux töten (killall, ps, grep, awk)

Einige Prozesse lasen sich nicht ohne weiteres an „kill“ / „killall“ übergeben, da der Prozessname Leerzeichen enthält. Gerade bei Java-Anwendungen ist das meistens der Fall, da die JRE im Prozessnamen enthalten ist und ggf auch Parameter mit aufgeführt werden. Meist ist also nur ein Teil des Prozessnamens bekannt, z.B. das jar-Archiv.

Folgender Befehl extrahiert die PID, wenn nur der Name des jar-Archives bekannt ist:

ps ax | grep -v grep | grep ‚meinjavaprogramm.jar‘ | awk ‚{print $1}‘

Als Ergebis wird NUR die PID ausgegeben, z.B. 14244. Die kann kann an „kill“ angehängt werden: kill [param] 14244

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: 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 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 🙂