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

J2EE Web 服務客戶端質量報告實戰(二):服務端 Tie 類改造與報告剝離

     編輯:Java 相關知識

本篇聚焦服務端 Web 服務運行時組件——Tie 類的改造,實現從 SOAP 請求中剝離客戶端攜帶的性能報告,並將其注入異步處理管道。

一、服務端 Web 服務包生成與 Tie 類角色

  • 生成方式:Sun ONE Studio 中選擇 EJB 方法 → 右鍵創建 Web Module → Web Service Module 向導自動生成
  • 關鍵類:<ServiceName>ServantInterface_Tie (如 XactServiceServantInterface_Tie)
  • 職能:Web 服務調用棧頂層組件,負責 SOAP 請求反序列化 → 調用 EJB 業務方法 → 響應序列化
  • 方法映射:每個 EJB 業務方法對應一個 invoke_<MethodName>()

二、Tie 類改造核心邏輯

1. 引入依賴

import Payload.*; // 共享 Payload 包

2. 修改模板:每個 invoke 方法插入剝離調用

private void invoke_SubmitWork(StreamingHandlerState state) throws Exception {
    // ... 反序列化請求參數代碼 (自動生成) ...
    
    // 【核心插入】剝離第一個附件並送入異步隊列
    Serializer.queueFirstAttachmentText(state.getMessageContext());
    
    // ... 調用 EJB 方法、構建響應代碼 (自動生成) ...
}

3. 關鍵 API 分析

  • state.getMessageContext():返回實現 javax.xml.rpc.handler.soap.SOAPMessageContext 的對象,提供對當前 SOAP 消息的訪問
  • Serializer.queueFirstAttachmentText():
    1. 獲取 SOAP 消息附件迭代器
    2. 提取第一個附件內容 (XML 字符串)
    3. 移除該附件 (避免干擾後續業務反序列化)
    4. 調用 queueReportXML() 發送至 JMS 隊列

4. 完整 invoke_SubmitWork 示例 (節選)

private void invoke_SubmitWork(StreamingHandlerState state) throws Exception {
    TransactionService.XactServiceGenServer.XactServiceServantInterface_SubmitWork_RequestStruct req = null;
    Object reqObj = state.getRequest().getBody().getValue();
    
    // 【插入點】報告剝離
    Serializer.queueFirstAttachmentText(state.getMessageContext());
    
    if (reqObj instanceof SOAPDeserializationState) {
        req = ((SOAPDeserializationState) reqObj).getInstance();
    } else {
        req = (TransactionService.XactServiceGenServer.XactServiceServantInterface_SubmitWork_RequestStruct) reqObj;
    }
    
    String result = ((XactServiceServantInterface) getTarget()).SubmitWork(req.getString_1());
    
    // 構建響應...
    TransactionService.XactServiceGenServer.XactServiceServantInterface_SubmitWork_ResponseStruct resp = 
        new TransactionService.XactServiceGenServer.XactServiceServantInterface_SubmitWork_ResponseStruct();
    resp.setResult(result);
    SOAPBlockInfo bodyBlock = new SOAPBlockInfo(ns1_SubmitWork_SubmitWorkResponse_QNAME);
    bodyBlock.setValue(resp);
    bodyBlock.setSerializer(resp_SOAPSerializer);
    state.getResponse().setBody(bodyBlock);
}

三、全覆蓋原則

  • 所有業務方法:invoke_SubmitWork、invoke_CheckWork、invoke_GetResult 均需插入
  • 插入位置統一:反序列化請求參數之後、調用 EJB 方法之前
  • 不修改業務邏輯:僅添加監控側寫邏輯,保持業務代碼純淨

四、重新生成 Web Service 的風險提示

⚠️ 關鍵警告:在 Sun ONE Studio 中右鍵 Web Module 選擇 Create New Web Service 會覆蓋 Tie 類,導致手工插入的 Serializer.queueFirstAttachmentText() 丟失。

  • 最佳實踐:完成 Web Service 初次生成後,立即備份 Tie 類;後續若需重新生成,需重新應用修改
  • 替代方案:使用 SOAP Handler 鏈攔截請求/響應,避免侵入生成代碼 (但本系列採用直接修改 Tie 以演示核心原理)

五、架構流程回顧

  1. 客戶端 Stub 調用 _send() 前 → attachPendingReportToMessage() 附加報告
  2. SOAP over HTTP 傳輸至服務端
  3. 3. 服務端容器路由至 Tie 類 invoke_<Method>() 4. Tie 插入代碼 → queueFirstAttachmentText() 剝離報告 → JMS 隊列 5. MDB 異步消費 → 解析持久化 6. Tie 繼續正常調用 EJB → 返回業務響應

六、總結

通過在自動生成的 Tie 類中植入單行調用,實現了服務端對客戶端性能報告的零侵入式剝離。該改造遵循開閉原則:對業務邏輯關閉修改,對監控功能開放擴展。配合客戶端 Stub 改造,構成完整的雙向報告傳輸鏈路。

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