首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JMX 自動化部署 WebSphere J2EE 企業應用:從資料源建立到 EAR 熱部署

     編輯:Java 相關知識

部署自動化必要性

手工部署步驟繁瑣且易出錯:

  1. 建立資料源 (JDBC Provider → Data Source → JNDI 名稱)
  2. 修改 EAR 內資源參考 (res-ref) 與 EJB 參考 (ejb-ref) 的 JNDI 綁定
  3. 安裝 EAR 應用
  4. 重啟伺服器生效

當同一應用需部署多實例 (不同 JNDI、不同資料庫),或頻繁發布,JMX 自動化 成為唯一可行方案。

WebSphere JMX 管理模型

  • AdminClient:SOAP/RMI 連線管理介面
  • ConfigService:配置存取代理 (建立/修改/查詢配置物件)
  • AppManagement:應用生命週期管理 (安裝/啟動/停止/解除安裝)
  • ObjectName:JMX 物件唯一標識 (Cell/Node/Server/資源層級)

核心自動化流程實作

1. 建立 AdminClient 連線

Properties props = new Properties();
props.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
props.setProperty(AdminClient.CONNECTOR_HOST, "192.168.1.100");
props.setProperty(AdminClient.CONNECTOR_PORT, "8880");
AdminClient adminClient = AdminClientFactory.createAdminClient(props);

2. 智慧型資料源建立 (冪等操作)

ConfigService configService = new ConfigServiceProxy(adminClient);
Session session = new Session();

// 2.1 定位/建立 JDBC Provider
ObjectName[] providers = configService.resolve(session, 
    "Cell=myCell:Node=myNode:JDBCProvider");
ObjectName jdbcProvider = findOrCreateJDBCProvider(configService, session, providers);

// 2.2 定位/建立 Data Source
ObjectName[] dataSources = configService.resolve(session,
    "Cell=myCell:Node=myNode:JDBCProvider=" + jdbcProvider.getKeyProperty("name") + ":DataSource");
ObjectName dataSource = findOrCreateDataSource(configService, session, dataSources, jdbcProvider);

// 2.3 儲存配置
configService.save(session, true);
configService.discard(session);

3. EAR 應用修改與部署

// 3.1 取得部署任務
AppDeploymentTask task = appMgmt.createTask("install", earFilePath);

// 3.2 修改綁定 (資源參考、EJB 參考、虛擬主機、上下文根)
task.setProperty("bindings.resourceRefs[0].jndiName", "jdbc/MyAppDS");
task.setProperty("bindings.ejbRefs[0].jndiName", "ejb/MyService");
// ... 其他綁定

// 3.3 執行部署 (非同步 + 事件監聽)
appMgmt.performTask(task, new NotificationListener() {
    @Override
    public void handleNotification(Notification notif, Object handback) {
        AppNotification evt = (AppNotification) notif.getUserData();
        if (evt.getTaskName().equals(AppNotification.INSTALL)) {
            if (evt.getTaskStatus().equals(AppNotification.STATUS_COMPLETED)) {
                System.out.println("部署成功");
                adminClient.removeNotificationListener(appMgmtMBean, this);
            } else if (evt.getTaskStatus().equals(AppNotification.STATUS_FAILED)) {
                System.err.println("部署失敗: " + evt.getMessage());
                adminClient.removeNotificationListener(appMgmtMBean, this);
            }
        }
    }
});

4. Web 模組上下文根修改 (JAXP/JDOM)

// 解壓 EAR → 修改 META-INF/application.xml 或 WAR 內 ibm-web-bnd.xmi
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(webXmlFile);
NodeList contextRoots = doc.getElementsByTagName("context-root");
contextRoots.item(0).setTextContent("/myapp-v2");
// 重新封裝 EAR

完整部署流程圖

開始
  ↓
連線 AdminClient (SOAP)
  ↓
檢查/建立 JDBC Provider
  ↓
檢查/建立 Data Source (JNDI 名稱參數化)
  ↓
儲存配置變更
  ↓
解壓 EAR → 修改綁定描述檔 (XSLT/JDOM)
  ↓
建立 AppDeploymentTask
  ↓
設定資源/EJB/虛擬主機綁定
  ↓
啟動非同步部署 + 註冊 NotificationListener
  ↓
等待完成事件 → 成功/失敗處理
  ↓
(可選) 啟動應用
  ↓
結束

關鍵技術難點與對策

難點對策
ObjectName 路徑複雜多變封裝路徑建構工具類、使用 queryNames 模糊查詢
配置衝突 (同名資源)先查詢再決定建立/更新、使用唯一前綴命名
EAR 綁定修改細節繁多建立範本 EAR、使用 XSLT 標準化轉換
非同步部署狀態追蹤NotificationListener + 狀態機處理各階段事件
叢集環境同步針對 DeploymentManager 操作、使用 sync 操作

生產環境部署腳本化建議

  • 將上述邏輯封裝為 Ant Task / Maven Plugin / Gradle Task
  • 參數化:Cell/Node/Server、JNDI 名稱、EAR 路徑、版本號
  • 整合 CI/CD 流水線:建置 → 單元測試 → 自動部署測試環境 → 人工核准 → 生產部署
  • 支援回滾:保留前版本 EAR、記錄配置快照

參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved