J2EE 應用部署對部署人員意義重大。現有應用伺服器支援 Web 部署、熱部署、部署工具。但當同一應用需在同一 WebSphere 運行多實例、EJB 組件眾多、JNDI 名稱與資源引用大量差異化時,手工操作效率極低、極易出錯。WebSphere 提供基於 JMX (Java Management Extensions) 的 Java API,實現部署與管理自動化。本文梳理核心流程與關鍵代碼模式。
// 創建 AdminClient(SOAP 連接器)
Properties props = new Properties();
props.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
props.setProperty(AdminClient.CONNECTOR_HOST, ipAddress);
props.setProperty(AdminClient.CONNECTOR_PORT, port);
AdminClient adminClient = AdminClientFactory.createAdminClient(props);
// 定位現有 JDBC Provider
ConfigService configService = new ConfigServiceProxy(adminClient);
Session session = new Session();
ObjectName[] providers = configService.resolve(session,
"Cell=" + cell + ":Node=" + node + ":JDBCProvider");
ObjectName targetProvider = null;
for (ObjectName provider : providers) {
String name = (String) configService.getAttribute(session, provider, "name");
if ("xxx JDBC Provider".equals(name)) {
targetProvider = provider;
break;
}
}
// 創建數據源配置...(省略具體 Attribute 設置)
// 保存配置
configService.save(session, true);
configService.discard(session);
AppDeploymentTask 任務public void handleNotification(Notification notf, Object handback) {
try {
AppNotification ev = (AppNotification) notf.getUserData();
if (ev.taskName.equals(AppNotification.INSTALL)) {
if (ev.taskStatus.equals(AppNotification.STATUS_COMPLETED)) {
System.out.println("install succeeded .. remove listener");
adminClient.removeNotificationListener(appMgmtMBean, listener);
} else if (ev.taskStatus.equals(AppNotification.STATUS_FAILED)) {
adminClient.removeNotificationListener(appMgmtMBean, listener);
System.out.println("install failed .. remove listener");
isFinish = true;
} else {
System.out.println("other message...");
}
}
} catch (Exception ex) { ex.printStackTrace(); }
}
部署流程:提交安裝任務 → 註冊 Listener → 異步接收完成/失敗通知 → 清理 Listener → 後續處理。
WebSphere JMX API 為 J2EE 應用自動化部署提供了強大程序化介面。通過AdminClient 連接、ConfigService 配置操作、AppDeploymentTask 部署任務、NotificationListener 異步監聽四大核心組件,可構建健壯、可復用、可擴展的自動化部署體系。這是從「手工作坊」走向「交付流水線」的關鍵一步。