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

WebLogic 異步調用 WebService 深度解析:客戶端退出時服務端行為與資源影響

     編輯:Java 相關知識

場景:客戶端異步調用 WebLogic WebService(generateAsyncMethods=true 生成 startMethod/endMethod),若客戶端不等待結果直接退出,服務端是否保存結果?大量此類請求是否導致連接/記憶體洩漏?

兩種異步模式辨析

  1. 單向異步:@Oneway,客戶端發後即忘,無返回值,服務端不回應 SOAP 回覆。
  2. 雙向異步(本文重點):客戶端調用 startXxx(params, AsyncInfo) 獲取 FutureResult,稍後調用 endXxx(FutureResult) 取結果。客戶端可輪詢 isCompleted() 或註冊 ResultListener 回調。

客戶端異步調用流程剖析

startSayHello() → StubImpl._startAsyncInvoke() → DefaultOperation.asyncInvoke()
→ ClientDispatcher.asyncDispatch() → 建立 FutureResultImpl + 啟動接收線程
→ Http11ClientBinding.send() → 發送 HTTP 請求

關鍵點:接收線程由客戶端 JVM 啟動(getThreadPool().addTask()),負責讀取 HTTP 回應、填充 FutureResultImpl、觸發 Listener。

客戶端退出時的完整行為鏈

時機請求狀態連接狀態結果處理
退出前已處理完完成已釋放結果在 FutureResultImpl 中,隨客戶端 JVM 退出銷毀
退出時仍在處理進行中客戶端主動 Close → 服務端 OutputStream 仍存活服務端寫完回應關閉 Socket,無接收者,數據丟棄

資源影響結論

  • ✅ 連接資源:請求完成服務端主動關閉(TIME_WAIT);客戶端退出導致連接斷開。無連接洩漏。
  • ✅ 記憶體:服務端不緩存結果,直接寫回客戶端 OutputStream。無堆積風險。
  • ✅ 線程:客戶端接收線程隨 JVM 退出終止;服務端執行線程正常結束。無線程洩漏。

最佳實踐建議

  • 長耗時業務優先採用異步調用,釋放客戶端線程併行處理其他邏輯。
  • 客戶端務必實現超時/取消機制:輪詢 isCompleted() 設定最大等待時間,或註冊 Listener 內部控制。
  • 服務端配置合理的執行超時(如 WebLogic ``),防止異常業務佔用線程池。
  • 監控指標:併發異步請求數、平均處理時間、客戶端取消率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved