Preparación y actualización de un módulo a través de la programación
Puede actualizar un módulo para una aplicación existente a través de la consola de administración, la herramienta wsadmin o mediante programación. Al actualizar un módulo, se sustituye el módulo existente por una nueva versión. Utilice este ejemplo para actualizar un módulo a través de programación.
Antes de empezar
En esta tarea se da por supuesto que se tienen conocimientos básicos de la programación de MBean. Si desea información sobre la programación de MBean, consulte la documentación de la interfaz de programación de aplicaciones (API) Java™ de MBean. En este Information Center, pulse .
Para poder actualizar un módulo en WebSphere Application Server, primero debe instalar la aplicación.
Acerca de esta tarea
Lleve a cabo las tareas siguientes para actualizar un módulo a través de programación.
Procedimiento
Resultados
Después de ejecutar satisfactoriamente el código, el módulo existente se sustituye por el nuevo.
Ejemplo
En el ejemplo siguiente se muestra cómo añadir un módulo a una aplicación basándose en los pasos anteriores. Algunas sentencias están partidas en varias líneas para fines de impresión.
//Entradas:
//moduleName especifica el nombre del módulo que se añade a la aplicación.
//moduleURI especifica un URI que ofrece la ubicación de destino del contenido
//del archivo archivador del módulo en un sistema de archivos. El URI proporciona la ubicación del módulo
//nuevo después de la instalación. El URI es relativo al URL de la aplicación.
//uniquemoduleURI especifica el URI que ofrece la ubicación de destino del
// archivo del descriptor de despliegue. El URI es relativo al URL de la aplicación.
//target especifica la célula, el nodo y el servidor en el que está instalado el módulo.
//appName especifica el nombre de la aplicación que debe actualizarse.
![[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";
//Obtener el cliente administrativo para conectar con
//WebSphere Application Server.
AdminClient client = ...;
AppManagement proxy = AppManagementProxy.getJMXProxyForClient(client);
Vector tasks = proxy.getApplicationInfo (appName, new Hashtable(), null);
//Crear una instancia de controlador de despliegue, AppDeploymentController,
//para llenar el archivo archivador Java (JAR) con información de enlace.
//La información de enlace es información de despliegue específica de WebSphere Application Server.
Hashtable preferences = new Hashtable();
preferences.put (AppConstants.APPDEPL_LOCALE, Locale.getDefault());
preferences.put (AppConstants.APPUPDATE_CONTENTTYPE, AppConstants.APPUPDATE_CONTENT_MODULEFILE);
// Si un módulo es update, hay tres posibles acciones de fusión:
// AppConstants.APPREDEPL_DEFAULT_MERGE (la acción de fusión predeterminada),
// Esta opción especifica que durante la acción de actualización se prefiere
// la información de enlace de la versión nueva del archivo EAR o módulo
// a la información de enlace correspondiente de la versión anterior. Si faltara algún elemento
// de enlace en la versión nueva, se utilizará el elemento correspondiente
// de la versión anterior.
// AppConstants.APPREDEPL_IGNORE_OLDBND,
// Esta opción especifica que durante la acción de actualización se prefiere
// la información de enlace de la versión nueva del módulo
// a la información de enlace correspondiente de la versión anterior. Los enlaces de la
// versión anterior de la aplicación o módulo se ignoran.
// AppConstants.APPREDEPL_IGNORE_NEWBND
// Esta opción especifica que durante la acción de actualización, se prefiere
// la información de enlace de la versión anterior del módulo
// a la información de enlace correspondiente de la versión nueva. Si algún elemento del
// enlace no existe en la versión anterior,
// se utilizará el elemento de la versión nueva.
//
// Para buscar el objeto de configuración coincidente para realizar la acción de fusión, se comparan
// los valores de los campos de sólo lectura de la tarea del módulo nuevo
// con los valores de los campos de sólo lectura de la tarea del módulo existente.
// Si todos los valores de sólo lectura coinciden, se llevará a cabo
// la acción de fusión que corresponda.
preferences.put (AppConstants.APPREDEPL_IGNORE_NEWBND, Boolean.TRUE);
AppDeploymentController controller = AppManagementFactory.readArchiveForUpdate(
moduleName,
moduleURI,
AppConstants.APPUPDATE_UPDATE,
preferences,
tasks);
Si el módulo que actualiza para la aplicación no tiene enlaces, añada los enlaces para que la actualización del módulo funcione. Recopile y añada los enlaces mediante las API públicas que se proporcionan con el producto. Consulte la documentación de Java sobre la instancia AppDeploymentController para obtener más información sobre cómo recopilar y llenar tareas con información de enlace específica de WebSphere Application Server. La instancia de AppDeploymentController contiene metadatos definidos en los descriptores de despliegue basados en XML, así como las anotaciones definidas en las clases Java dentro del módulo de entrada.
//Después de recopilar toda la información de enlace, guárdela en el módulo.
controller.saveAndClose();
//Crear el filtro de notificación.
NotificationFilterSupport myFilter = new NotificationFilterSupport();
myFilter.enableType (NotificationConstants.TYPE_APPMANAGEMENT);
//Añadir la escucha.
NotificationListener listener = new AListener(_soapClient, myFilter,
"Install: " + appName, AppNotification.UPDATE);
//Obtener las opciones de instalación.
Hashtable options = controller. getAppDeploymentSavedResults();
//Actualizar la aplicación existente añadiendo el módulo.
options.put (AppConstants.APPUPDATE_CONTENTTYPE,
AppConstants. APPUPDATE_CONTENT_MODULEFILE);
//Especificar el destino del nuevo módulo.
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);
// Espere. La interfaz de programación de aplicaciones (API) es
// asíncrona y por lo tanto vuelve de inmediato.
// Si el programa no espera en este punto, finaliza.
Thread.sleep(300000); // Espere para que el programa no finalice.
}
catch (Exception e) {
e.printStackTrace();
}
}
}
// Especificar la escucha de notificaciones de JMX (Java Management Extensions) para los sucesos de JMX.
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);
//Cuando la instalación finalice, elimine la escucha y salga de la aplicación
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);
}
}
}