既存のアプリケーションのモジュールの更新は、管理コンソール、 wsadmin ツール、またはプログラミングによって行うことができます。モジュールを更新すると、 既存のモジュールが新規バージョンで置き換えられます。この例を使用し、プログラミングによってモジュールを更新します。
WebSphere Application Server 上でモジュールを更新する前に、 まずアプリケーションをインストールする必要があります。
以下のタスクを実行し、プログラミングによってモジュールを更新します。
以下の例には、前のステップに基づいた、アプリケーションへのモジュールの追加方法が示されています。 一部のステートメントは印刷目的のために複数行に分割されています。
//Inputs: //moduleName specifies the name of the module that you add to the application. //moduleURI specifies a URI that gives the target location of the module // archive contents on a file system. The URI provides the location of the new // module after installation. この URI は、アプリケーションの URL について相対です。 //uniquemoduleURI specfies the URI that gives the target location of the // deployment descriptor file. この URI は、アプリケーションの URL について相対です。 //target specifies the cell, node, and server on which the module is installed. //appName specifies the name of the application to update. String moduleName = "C:/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"; //Get the administrative client to connect to //WebSphere Application Server. AdminClient client = ...; AppManagement proxy = AppManagementProxy. getJMXProxyForClient (client); Vector tasks = proxy.getApplicationInfo (appName, new Hashtable(), null); //Create an application deployment controller instance, AppDeploymentController, //to populate the Java archive (JAR) file with binding information. //The binding information is WebSphere Application Server-specific deployment information. Hashtable preferences = new Hashtable(); preferences.put (AppConstants.APPDEPL_LOCALE, Locale.getDefault()); preferences.put (AppConstants.APPUPDATE_CONTENTTYPE, AppConstants.APPUPDATE_CONTENT_MODULEFILE); AppDeploymentController controller = AppManagementFactory.readArchiveForUpdate( moduleName, moduleURI, AppConstants.APPUPDATE_UPDATE, preferences, tasks);
アプリケーション用に更新するモジュールにバインディングがない場合は、 バインディングを追加することによって、モジュールの更新が機能します。WebSphere Application Server で提供されているパブリック API を使用して、バインディングを収集および追加します。WebSphere Application Server 固有のバインディング情報を収集してタスクに取り込む方法について詳しくは、AppDeploymentController インスタンスの Java 資料を参照してください。
//After you collect all the binding information, save it in the module. controller.saveAndClose(); //Create the notification filter. NotificationFilterSupport myFilter = new NotificationFilterSupport(); myFilter.enableType (NotificationConstants.TYPE_APPMANAGEMENT); //Add the listener. NotificationListener listener = new AListener(_soapClient, myFilter, "Install: " + appName, AppNotification.UPDATE); //Get the installation options. Hashtable options = controller. getAppDeploymentSavedResults(); //Update the existing application by adding the module. options.put (AppConstants.APPUPDATE_CONTENTTYPE, AppConstants. APPUPDATE_CONTENT_MODULEFILE); //Specify the target for the new module 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); // Wait; the installation application programming interface (API) is // asynchronous and so returns immediately. // If the program does not wait here, the program ends. Thread.sleep(300000); // Wait so that the program does not end. } catch (Exception e) { e.printStackTrace(); } } } // Specify the Java Management Extensions (JMX) notification listener for JMX events. 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); //When the installation is done, remove the listener and quit 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); } } }