本篇聚焦服務端 Web 服務運行時組件——Tie 類的改造,實現從 SOAP 請求中剝離客戶端攜帶的性能報告,並將其注入異步處理管道。
<ServiceName>ServantInterface_Tie (如 XactServiceServantInterface_Tie)invoke_<MethodName>()import Payload.*; // 共享 Payload 包
private void invoke_SubmitWork(StreamingHandlerState state) throws Exception {
// ... 反序列化請求參數代碼 (自動生成) ...
// 【核心插入】剝離第一個附件並送入異步隊列
Serializer.queueFirstAttachmentText(state.getMessageContext());
// ... 調用 EJB 方法、構建響應代碼 (自動生成) ...
}
state.getMessageContext():返回實現 javax.xml.rpc.handler.soap.SOAPMessageContext 的對象,提供對當前 SOAP 消息的訪問Serializer.queueFirstAttachmentText():
queueReportXML() 發送至 JMS 隊列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 均需插入⚠️ 關鍵警告:在 Sun ONE Studio 中右鍵 Web Module 選擇 Create New Web Service 會覆蓋 Tie 類,導致手工插入的 Serializer.queueFirstAttachmentText() 丟失。
_send() 前 → attachPendingReportToMessage() 附加報告invoke_<Method>()
4. Tie 插入代碼 → queueFirstAttachmentText() 剝離報告 → JMS 隊列
5. MDB 異步消費 → 解析持久化
6. Tie 繼續正常調用 EJB → 返回業務響應
通過在自動生成的 Tie 類中植入單行調用,實現了服務端對客戶端性能報告的零侵入式剝離。該改造遵循開閉原則:對業務邏輯關閉修改,對監控功能開放擴展。配合客戶端 Stub 改造,構成完整的雙向報告傳輸鏈路。