Neuer Releaseplan für GlassFish 3.1.1

Für die nächste Version des GlassFish-OpenSource Servers wurde der Releaseplan überarbeitet. Ursprünglich sollte GlassFish 3.1.1 bereits veröffentlicht sein, doch es wurden noch ein paar neue Anforderungen mit aufgenommen - wodurch sich der Plan verzögert hat.

Vor allem einige integrierte Komponenten werden aktualisiert, wie bspw. Weld, Jersey und EclipseLink. Alexis Moussine-Pouchkine hat dazu Detailinformationen veröffentlicht.

Den überarbeiteten Releaseplan hat Alexis im Wiki veröffentlicht.

asadmin und Shell-Expansion

Nachdem ich eine neue GlassFish-Installation vorgenommen hatte, wollte ich mir wie üblich mit asadmin list alle konfigurierbaren Elemente ansehen. Da es sich um GlassFish 3.1 handelt, sollten deutlich mehr als bei GF v3 vorhanden sein. Die Ausgabe entsprach dann allerdings nicht ganz dem Gewünschten:

rittmey@ballblazer:~$ asadmin list *
Command list only accepts one operand
Usage: asadmin [asadmin-utility-options] list
	[-m|--monitor[=]]
	[-?|--help[=]] pattern
Command list failed.

Hups. Zunächst war ich irritiert, ob sich das list-Kommando möglicherweise in GlassFish 3.1 an der Stelle verändert hätte. Dabei war die Fehlermeldung nun wirklich mehr als deutlich: "Command list only accepts one operand."

Es hätte sich also gelohnt, sich die Ausgabe mal genauer anzuschauen. Aber wer macht das schon? Ich jedenfalls nicht.

Immerhin kam ich dann doch noch schnell drauf: Ich hatte einfach ignoriert, dass es ein so nützliches Feature wie die Shell-Expansion gibt. Dieses ersetzt bekanntlich den Asterisk durch alle Dateien des aktuellen Verzeichnisses. Normalerweise genau das, was man will, aber nicht in dem Fall.

Also einfach den Asterisk escapen ( asadmin list \* ) oder in Anführungsstrichen setzen ( asadmin list "*" ) und schon listet asadmin alle 256 Konfigurationsparameter auf.

asadmin - Hilfestellungen

asadmin ist in GlassFish das zentrale Kommandozeilentool zur Administration, das verschiedene Kommandos verarbeiten kann. In dieser Serie von Blogeinträgen zum Thema werden jeweils einzelne dieser Kommandos vorgestellt. Dabei will ich nicht die Dokumentation ersetzen, sondern hier v.a. das Zusammenspiel von Kommandos sowie deren Besonderheiten und versteckte Möglichkeiten behandeln.

Bisherige Einträge:
asadmin - Einführung
asadmin - list/get/set

Bereits in der Einführung zu asadmin habe ich geschrieben, dass asadmin eine Vielzahl von Kommandos versteht. Um nicht alle Kommandos auswendig lernen zu müssen, bietet asadmin geeignete Hilfestellungen an.

Bspw. verwendet GlassFish IIOP- und HTTP-Listener. Will man nun einen neuen anlegen, so kann man einfach

asadmin listener

eingeben und bekommt alle Befehle, die den Text "listener" enthalten, aufgelistet:

Closest matching command(s):
create-http-listener
create-iiop-listener
delete-http-listener
delete-iiop-listener
list-http-listeners
list-iiop-listeners
CLI001 Ungültiger Befehl listener. Listen Sie die gültigen Befehle mithilfe von "asadmin help" auf.

Bei der Suche kann man zudem den Asterisk als Platzhalter für beliebige Zeichenfolgen verwenden. Will man alle Befehle anzeigen, die einen Listener erzeugen, gibt man anstelle des Obigen den folgenden Befehl ein:

asadmin create.*listener

Das Ergebnis sieht dann wie folgt aus:

Closest matching command(s):
create-http-listener
create-iiop-listener
CLI001 Ungültiger Befehl create.*listener. Listen Sie die gültigen Befehle mithilfe von "asadmin help" auf.

Zu beachten ist, dass wie bei regulären Ausdrücken ".*" und nicht einfach "*" zu verwenden ist. Leider funktionieren aber nicht alle reguläre Ausdrücke. Das Dollarzeichen für ein Zeilenende wird verwendet, das Caret (^) für den Zeilenanfang hingegen wird nicht ausgewertet.

Vergleichbare Hilfestellungen bekommt man, wenn man das Kommando falsch geschrieben hat. Auch dann werden die Kommandos gelistet, die dem eingegebenen am Ähnlichsten sind.

Gibt man ein Kommando ohne Argumente ein oder lässt man ein Pflichtattribut aus, so werden die benötigten Argumente angezeigt. Auch hierzu wieder ein Beispiel. Gibt man

asadmin create-http-listener

ein, so erhält man die folgende Ausgabe, die alle benötigten Attribute anzeigt, zusammen mit der Angabe, welche davon Pflichtattribute sind und welche nur optionale (anhand der []-Klammerung zu erkennen).

Verwendung: create-http-listener --listeneraddress address --listenerport listener_port --defaultvs virtual_server [--terse=false] [--echo=false] [--interactive=true] [--host localhost] [--port 4848|4849] [--secure | -s] [--user admin_user] [--passwordfile file_name] [--servername server_name] [--acceptorthreads acceptor_threads] [--xpowered=true] [--redirectport redirect_port] [--securityenabled=false] [--enabled=true] [--target target(Default server)] listener_id
CLI014 listenerport ist eine erforderliche Option.

Weitaus weniger komfortabel ist die direkte Hilfefunktion:

asadmin help

listet einem alle Befehle in einer rasch über den Bildschirm laufenden Liste auf. Glücklicherweise sollte diese Hilfe aufgrund der obigen Hilfestellungen nur selten notwendig sein. Weitaus nützlicher ist die Hilfe zu den einzelnen Kommandos, die man mit

asadmin help kommando

angezeigt bekommt. Auch hier wird die gesamte Hilfe auf einmal angezeigt. Ein geeigneter Pager (less oder more) bieten sich hier an. Die Hilfe bietet einem stets genaue Angaben zu den möglichen Attributen und einige allgemeine Hinweise zu dem Kommando. Sie ist letztlich eine im Ascii-Format abgelegte man-Page. Auf Solaris steht diese auch als reguläre man-Page zur Verfügung, bei den Linux- oder Mac OS X-Downloads ist dies derzeit aber leider noch nicht der Fall.

GlassFish setzt auf OSGi

Überraschend habe ich heute auf der Aquarium-Seite den Link zu Jerome's Blogeintrag gefunden. Demnach wird GlassFishs kommende Version v3 auf OSGi basieren. Das ist insofern überraschend, als SUN einen eigenen Standardisierungs-Request (JSR-277) gestartet hat, der ein Modulsystem schaffen sollte. Dieser Java Specification Request war von Anfang an umstritten. Die Notwendigkeit für ein Modulsystem selbst war und ist dabei in der Java-Community unstrittig. Allerdings wurde dieser JSR stets als ein Gegenentwurf zu OSGi betrachtet.

Ob die Entscheidung, für GlassFish einen OSGi-Kern zu nutzen und nicht mehr auf HK2 zu setzen, einen generellen Richtungswechsel SUNs und möglicherweise das Aus für JSR-277 bedeutet, bleibt abzuwarten. Für GlassFish bedeutet diese Entscheidung jedenfalls, dass Entwickler, die für GlassFish Module entwickeln wollen, keine eigene Technologie lernen müssen, sondern vorhandenes Wissen nutzen können. Und anders rum können sie dadurch ihr bei GlassFish erworbenes Wissen bruchlos in anderen Projekten nutzen.

Da SUN auch angekündigt hat, die OSGi-Implementierung, die die Basis von GlassFish bilden wird, aktiv zu unterstützen, wird auch das Open Source-Projekt, das hier zum Zuge kommt, von diesem Schritt SUNs profitieren.

Kurzum ein zwar überraschender dafür aber umso willkommenerer Schritt von SUN.

asadmin - list/get/set

asadmin ist in GlassFish das zentrale Kommandozeilentool zur Administration, das verschiedene Kommandos verarbeiten kann. In dieser Serie von Blogeinträgen zum Thema werden jeweils einzelne dieser Kommandos vorgestellt. Dabei will ich nicht die Dokumentation ersetzen, sondern hier v.a. das Zusammenspiel von Kommandos sowie deren Besonderheiten und versteckte Möglichkeiten behandeln.

Bisherige Einträge:
asadmin - Einführung

Nachdem ich im letzen Blogeintrag zu asadmin die Grundzüge des Befehls vorgestellt habe, werde ich diesmal die drei eng verwandten Kommandos list, get und set vorstellen.

Alle drei Kommandos behandeln konfigurierbare Elemente in GlassFish. Diese Elemente bilden einen hierarchischen Baum, in dem jeder Vaterknoten beliebig viele Kindknoten haben kann. Die einzelnen Elemente sind dabei per Punkt voneinander getrennt.

Am besten sehen wir dies an einem Beispiel:

asadmin list server.applications.web-module

Dieser Befehl listet alle Webmodule, die für die Domain konfiguriert sind, auf. Das Wurzelelement hier ist "server", dessen Kindknoten "applications" und dessen Kindknoten wiederum "web-module". "server.applications.web-module" ist der sogenannte dotted name dieses Konfigurationselements.

Das "list"-Kommando dient dazu, herauszufinden, welche konfigurierbaren Elemente es unterhalb eines Knotens gibt. Im Zweifelsfall kann man sich mit

asadmin list server.*

alle Elemente holen.

Knoten, deren Namen man nicht oder nur teilweise kennt, kann man mittels des Asterisks (*) auslassen. Auch hierfür wieder ein Beispiel:

asadmin list server.*listener.*

Dieser Befehl zeigt einem alle konfigurierten HTTP- und IIOP-Listener an. Bspw. für eine frisch aufgesetzte Entwickler-Domain:

server.http-service.http-listener.admin-listener
server.http-service.http-listener.http-listener-1
server.http-service.http-listener.http-listener-2
server.http-service.http-listener.http-listener-2.ssl
server.iiop-service.iiop-listener.SSL
server.iiop-service.iiop-listener.SSL.ssl
server.iiop-service.iiop-listener.SSL_MUTUALAUTH
server.iiop-service.iiop-listener.SSL_MUTUALAUTH.ssl
server.iiop-service.iiop-listener.orb-listener-1

Das "list"-Kommando kann nur Elemente selber anzeigen. Will ich hingegen die Attribute eines Elements sehen oder setzen, so muss ich die "get"- bzw. "set"-Kommandos nutzen. Bspw. kann ich mir den Listener "http-listener-1" im Detail mit dem folgenden Kommando ansehen:

asadmin get server.http-service.http-listener.http-listener-1.*

Und als Ergebnis bekomme ich die folgende Liste:

server.http-service.http-listener.http-listener-1.acceptor-threads = 1
server.http-service.http-listener.http-listener-1.address = 0.0.0.0
server.http-service.http-listener.http-listener-1.blocking-enabled = false
server.http-service.http-listener.http-listener-1.default-virtual-server = server
server.http-service.http-listener.http-listener-1.enabled = true
server.http-service.http-listener.http-listener-1.external-port =
server.http-service.http-listener.http-listener-1.family = inet
server.http-service.http-listener.http-listener-1.id = http-listener-1
server.http-service.http-listener.http-listener-1.port = 8080
server.http-service.http-listener.http-listener-1.property.proxiedProtocols = ws/tcp
server.http-service.http-listener.http-listener-1.redirect-port =
server.http-service.http-listener.http-listener-1.security-enabled = false
server.http-service.http-listener.http-listener-1.server-name =
server.http-service.http-listener.http-listener-1.xpowered-by = true

Nun will ich gerne auf 8080 einen Tomcat nutzen, also ändere ich den Port des Listeners wie folgt:

asadmin set server.http-service.http-listener.http-listener-1.port=8888

Bei "set"-Kommandos sind Wildcards (*) nicht erlaubt, bei get-Kommandos hingegen schon. Bspw. nutze ich folgenden Befehl, um alle Infos über die Anwendung jsptut (die Anwendung, die für das JSP-Tutorial zuständig ist) zu erhalten:

asadmin get server.*.jsptut.*

Wie man im Ergebnis sieht, erhalte ich dabei gleich Infos zu zwei anwendungsrelevanten Knoten sowie zu dem gleich benannten virtuellen Server, der der Anwendung zugeordnet ist:

server.application-ref.jsptut.disable-timeout-in-minutes = 30
server.application-ref.jsptut.enabled = true
server.application-ref.jsptut.lb-enabled = false
server.application-ref.jsptut.ref = jsptut
server.application-ref.jsptut.virtual-servers = jsptut
server.applications.web-module.jsptut.availability-enabled = false
server.applications.web-module.jsptut.context-root = /
server.applications.web-module.jsptut.description =
server.applications.web-module.jsptut.directory-deployed = true
server.applications.web-module.jsptut.enabled = true
server.applications.web-module.jsptut.libraries =
server.applications.web-module.jsptut.location = /some/path/to/exploded/dir
server.applications.web-module.jsptut.name = jsptut
server.applications.web-module.jsptut.object-type = user
server.http-service.virtual-server.jsptut.default-web-module =
server.http-service.virtual-server.jsptut.docroot =
server.http-service.virtual-server.jsptut.hosts = jsptutorial.org,www.jsptutorial.org
server.http-service.virtual-server.jsptut.http-listeners = http-listener-1,http-listener-2
server.http-service.virtual-server.jsptut.id = jsptut
server.http-service.virtual-server.jsptut.log-file = ${com.sun.aas.instanceRoot}/logs/server.log
server.http-service.virtual-server.jsptut.property.docroot = ${com.sun.aas.instanceRoot}/docroot
server.http-service.virtual-server.jsptut.state = on

Ein abschließendes Beispiel für eine schöne Nutzung des "get"-Kommandos, mit dem man schnell einen Überblick über alle von GlassFish belegten Ports bekommt:

asadmin get *.port

Das Ergebnis listet einem alle genutzten Ports auf. Der dotted name lässt zudem auf den Zweck des jeweiligen Ports schließen:

server.admin-service.jmx-connector.system.port = 8186
server.http-service.http-listener.admin-listener.port = 4848
server.http-service.http-listener.http-listener-1.port = 8888
server.http-service.http-listener.http-listener-2.port = 8181
server.iiop-service.iiop-listener.SSL.port = 8038
server.iiop-service.iiop-listener.SSL_MUTUALAUTH.port = 8039
server.iiop-service.iiop-listener.orb-listener-1.port = 8037
server.jms-service.jms-host.default_JMS_host.port = 8076

Eine Anmerkung noch: "port" ist in diesem Beispiel ein Attribut, das von mehreren Elementen genutzt wird. Daher musste ich "port" als letzten Teil des dotted names angeben. Kenne ich hingegen das Element und will alle Attribute zu diesem Element wie im vorletzten Beispiel, so muss ich den dotted name mit ".*" abschließen.

Hat man sich mit list/get/set vertraut gemacht, ist dies ein sehr nützliches Kommando-Trio. In meinem englischen Blog habe ich beschrieben, wie ich ausschließlich mit asadmin meine GlassFish-Instanz für vier virtuelle Domains konfiguriert habe. Die hier beschriebenen Kommandos waren dabei ein wichtiger Teil.

Und wer die Kommandos besser verstehen will, kann sich mal mit "asadmin list server.*" alle Elemente ansehen. Oder sich mit dem Unterschied zwischen "asadmin get server.*" und "asadmin get server.*.*" vertraut machen ;-)

In dem Sinne: Happy Coding!