Ein Modul durch Programmierung vorbereiten und aktualisieren
Sie können ein Modul für eine vorhandene Anwendung mit der Administrationskonsole, mit dem Tool "wsadmin" oder durch Programmierung aktualisieren. Wenn Sie ein Modul aktualisieren, ersetzen Sie das vorhandene Modul durch eine neue Version. Das folgende Beispiel veranschaulicht die Aktualisierung eines Moduls durch Programmierung.
Vorbereitende Schritte
Für diese Task werden Grundkenntnisse in der Programmierung von MBeans vorausgesetzt. Weitere Informationen zur MBean-Programmierung finden Sie in der Dokumentation zu den MBean-Java™-APIs. Klicken Sie in diesem Information Center auf .
Damit Sie ein Modul in WebSphere Application Server aktualisieren können, müssen Sie zuerst die Anwendung installieren.
Informationen zu diesem Vorgang
Führen Sie die folgenden Tasks aus, um ein Modul durch Programmierung zu aktualisieren.
Vorgehensweise
Ergebnisse
Nach erfolgreicher Ausführung des Codes wird das vorhandene Modul durch das neue Modul ersetzt.
Beispiel
Das folgende Beispiel zeigt, wie Sie basierend auf den zuvor beschriebenen Schritten einer Anwendung ein Modul hinzufügen. Einige Anweisungen sind zur besseren Lesbarkeit auf mehrere Zeilen verteilt.
//Eingabe:
//moduleName gibt den Namen des Moduls an, das Sie der Anwendung hinzufügen.
//moduleURI gibt den URI für die Zielposition des Modularchivinhalts
// in einem Dateisystem an. Der URI gibt die Position des neuen Moduls
// nach der Installation an. Der URI ist relativ zum Anwendungs-URL.
// uniquemoduleURI gibt den URI für die Zielposition der Implementierungs-
// deskriptordatei an. Der URI ist relativ zum Anwendungs-URL.
// target gibt Zelle, Knoten und Server für die Modulinstallation an.
// appName gibt den Namen der zu aktualisierenden Anwendung an.
![[Windows]](../images/windows.gif)
String moduleName = "C:\apps\foo.jar";
![[Linux]](../images/linux.gif)
![[HP-UX]](../images/hpux.gif)
![[Solaris]](../images/solaris.gif)
![[AIX]](../images/aixlogo.gif)
![[z/OS]](../images/ngzos.gif)
![[IBM i]](../images/iseries.gif)
String moduleName = "/apps/foo.jar";
String moduleURI = "Increment.jar";
String uniquemoduleURI = "Increment.jar+META-INF/ejb-jar.xml";
String target = "WebSphere:cell=cellname,node=nodename,server=servername";
String appName = "MyApp";
//Verwaltungsclient für den Verbindungsaufbau zu
//WebSphere Application Server abrufen.
AdminClient client = ...;
AppManagement proxy = AppManagementProxy.getJMXProxyForClient(client);
Vector tasks = proxy.getApplicationInfo (appName, new Hashtable(), null);
//Controller-Instanz für die Anwendungsimplementierung erstellen,
// um die JAR-Datei mit Bindungsinformationen zu füllen.
// Die Bindungsinformationen sind Informationen, die spezielle für die implementierung von WebSphere Application Server gelten.
Hashtable preferences = new Hashtable();
preferences.put (AppConstants.APPDEPL_LOCALE, Locale.getDefault());
preferences.put (AppConstants.APPUPDATE_CONTENTTYPE, AppConstants.APPUPDATE_CONTENT_MODULEFILE);
// Wenn ein Modul aktualisiert wird, gibt es drei mögliche merge-Aktionen:
// AppConstants.APPREDEPL_DEFAULT_MERGE (Standard-merge-Aktion)
// Diese Option gibt an, dass während der Aktualisierungsaktion die
// Bindungsinformationen aus der neuen Version der EAR-Datei bzw. des Moduls
// den entsprechenden Bindungsinformationen aus der alten Version vorgezogen
// werden. Wenn ein Element der Bindung in der neuen Version fehlt, wird das
// entsprechende Element aus der alten Version verwendet.
// AppConstants.APPREDEPL_IGNORE_OLDBND,
// Diese Option gibt an, dass während der Aktualisierungsaktion die
// Bindungsinformationen aus der neuen Version des Modus den entsprechenden
// Bindungsinformationen aus der alten Version vorgezogen werden. Die
// Bindungen aus der alten Version der Anwendung bzw. des Moduls werden
// ignoriert.
// AppConstants.APPREDEPL_IGNORE_NEWBND
// Diese Option gibt an, dass während der Aktualisierungsaktion die
// Bindungsinformationen aus der alten Version des Modus den entsprechenden
// Bindungsinformationen aus der neuen Version vorzuziehen sind. Wenn ein
// Element der Bindung nicht in der alten Version vorhanden ist, wird das
// Element aus der neuen Version verwendet.
//
// Um das passende Konfigurationsobjekt für die Zusammenführungsaktion (merge) zu finden,
// werden die Werte der schreibgeschützten Felder der Task für das neue Modul mit
// den Werten der schreibgeschützten Felder der Task aus dem vorhandenen Modul
// verglichen. Wenn alle schreibgeschützten Werte übereinstimmen, wird die
// entsprechende Zusammenführungsaktion (merge) ausgeführt.
preferences.put (AppConstants.APPREDEPL_IGNORE_NEWBND, Boolean.TRUE);
AppDeploymentController controller = AppManagementFactory.readArchiveForUpdate(
moduleName,
moduleURI,
AppConstants.APPUPDATE_UPDATE,
preferences,
tasks);
Wenn das Modul, das Sie für die Anwendung aktualisieren, keine Bindungen hat, fügen Sie Bindungen hinzu, damit die Modulaktualisierung durchgeführt werden kann. Verwenden Sie zum Erfassen und Hinzufügen der Bindungen die öffentlichen APIs, die mit dem Produkt bereitgestellt werden. In der Java-Dokumentation zur AppDeploymentController-Instanz können Sie nachlesen, wie Tasks mit spezifischen Bindungsinformationen für WebSphere Application Server erfasst und eingetragen werden. Die AppDeploymentController-Instanz enthält Metadaten, die in XML-basierten Implementierungsdeskriptoren definiert sind, sowie Annotationen, die in Java-Klassen im Eingabemodul definiert sind.
//Nachdem Sie alle Bindungsinformationen erfasst haben, speichern Sie sie im Modul.
controller.saveAndClose();
// Benachrichtigungsfilter erstellen.
NotificationFilterSupport myFilter = new NotificationFilterSupport();
myFilter.enableType (NotificationConstants.TYPE_APPMANAGEMENT);
//Listener hinzufügen
NotificationListener listener = new AListener(_soapClient, myFilter,
"Install: " + appName, AppNotification.UPDATE);
//Installationsoptionen ermitteln.
Hashtable options = controller. getAppDeploymentSavedResults();
//Vorhandene Anwendung durch Hinzufügen des Moduls aktualisieren.
options.put (AppConstants.APPUPDATE_CONTENTTYPE,
AppConstants. APPUPDATE_CONTENT_MODULEFILE);
//Ziel für das neue Modul angeben.
Hashtable mod2svr = new Hashtable();
options.put (AppConstants.APPDEPL_MODULE_TO_SERVER, mod2svr);
mod2svr.put (uniquemoduleURI, target);
proxy.updateApplication ( appName,
moduleURI,
moduleName,
AppConstants.APPUPDATE_UPDATE,
options,
null); // Warten. Die Installations-API ist
// asynchron und gibt sofort ein Ergebnis zurück.
// Falls das Programm an dieser Stelle nicht wartet, wird das Programm beendet.
Thread.sleep(300000); // Warten, damit das Programm nicht beendet wird
}
catch (Exception e) {
e.printStackTrace();
}
}
}
// JMX-Listener für Benachrichtigungen für JMX-Ereignisse angeben.
class AListener implements NotificationListener
{
AdminClient _soapClient;
NotificationFilterSupport myFilter;
Object handback;
ObjectName on;
String eventTypeToCheck;
public AListener(AdminClient cl, NotificationFilterSupport fl,
Object h, String eType) throws Exception
{
_soapClient = cl;
myFilter = fl;
handback = h;
eventTypeToCheck = eType;
Iterator iter = _soapClient.queryNames (new ObjectName(
"WebSphere:type=AppManagement,*"), null).iterator();
on = (ObjectName)iter.next();
System.out.println ("ObjectName: " + on);
_soapClient.addNotificationListener (on, this, myFilter, handback);
}
public void handleNotification (Notification notf, Object handback)
{
AppNotification ev = (AppNotification) notf.getUserData();
System.out.println ("!! JMX event Recd: (handback obj= " + handback+ "): " + ev);
//Nach Abschluss der Installation Listener entfernen und Programm beenden.
if (ev.taskName.equals (eventTypeToCheck) &&
(ev.taskStatus.equals (AppNotification.STATUS_COMPLETED) ||
ev.taskStatus.equals (AppNotification.STATUS_FAILED)))
{
try
{
_soapClient.removeNotificationListener (on, this);
}
catch (Throwable th)
{
System.out.println ("Error removing listener: " + th);
}
System.exit (0);
}
}
}