簡體   English   中英

如何減少Apache CXF客戶端存根對象的內存大小?

[英]How to reduce memory size of Apache CXF client stub objects?

我的Web服務客戶端應用程序使用Apache CXF生成客戶端存根以與多個Web服務進行通信。 生成的CXF Web服務存根對象具有相當大的內存占用(10 - 15個Web服務對象占用超過64 MB的內存)。 有沒有辦法減少CXF對象的占用空間?

我們與Axis有類似的問題。 我們遇到的問題是我們想要對Web服務進行許多並發調用,並且使用WSDL生成的Axis客戶端導致每個客戶端使用大量內存。 客戶端不是線程安全的,因此我們必須為每個請求創建一個客戶端。

我們有兩個選擇。 首先,我們可以修剪生成的代碼 - 但這對於維護原因並不好。

其次,我們簡單地修剪了WSDL以刪除與我們無關的部分,並重新生成精簡的客戶端。 這樣,如果我們調用一個服務方法,它的客戶端將不包含該線程不會使用的不相關方法的批量。

工作得很好,但仍然是一個維護噩夢,因為任何時候WSDL更新(例如我們的合作伙伴發布他們的Web服務的新版本),我們需要花時間創建削減wsdls。 我想這是一個理想的解決方案,可以讓我們的合作伙伴認識到我們的問題並獲得減少的WSDL的所有權。

我們對CXF客戶端采用了不同的方法。 我沒有研究它的內存占用,這在我們的上下文中不是問題,但它肯定是一種比創建存根更簡單的開發方法。 它看起來像這樣:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();

factory.setAddress(endpoint);
factory.getServiceFactory().setDataBinding(new AegisDatabinding());
factory.setServiceClass(myInterface.class);
Object client = factory.create();
((BindingProvider) client).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);

myInterface stub = (myInterface)client;

我們這樣做(當然我們已經構建了一些實用程序類來進一步簡化)我們想要在運行時連接的任何WS(當然,前提是我們有它的Java接口)。 我們的目標是讓整個WS對程序員盡可能透明。 我們對WSDL和XSD 本身並不感興趣。 我們懷疑我們並不孤單。

如果您的SOAP需求非常基礎,那么您可以查看kSOAP2,它實際上是內存高效的。 它旨在在J2ME電話應用程序中正常運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM