2009-12-23 10 views
21

मेरी वेब सेवा क्लाइंट एप्लिकेशन कई वेब सेवाओं से बात करने के लिए क्लाइंट स्टब्स उत्पन्न करने के लिए Apache CXF का उपयोग करती है। उत्पन्न सीएक्सएफ वेब सेवा स्टब ऑब्जेक्ट्स में काफी बड़ी मेमोरी पदचिह्न है (10 - 15 वेब सेवा ऑब्जेक्ट्स 64 एमबी से अधिक मेमोरी लेते हैं)। क्या सीएक्सएफ ऑब्जेक्ट पदचिह्न को कम करने का कोई तरीका है?Apache CXF क्लाइंट स्टब ऑब्जेक्ट्स के मेमोरी आकार को कैसे कम करें?

+0

आप उन वस्तुओं को ठीक क्यों सोचते हैं जो स्मृति ले रहे हैं? – Bozho

+0

मैंने कुछ कच्ची प्रोफाइलिंग की (विंडोज टास्क मैनेजर में प्रक्रिया मेमोरी आकार देख रहा है)। एक परीक्षण ऐप बनाया गया है, कि एक लूप में, वेब सेवा स्टब्स के उदाहरण बनाता है और वेब सेवा से बांधता है। हर बार एक बाध्यकारी होता है एक और 5 - 10k स्मृति का उपयोग किया जाता है। वेब सेवा में लगभग 360 वेब विधियां हैं। –

+0

अपाचे सीएक्सएफ जेएक्स-डब्ल्यूएस के शीर्ष पर बनाया गया है, इसलिए मेरा मानना ​​है कि यह जेएक्स-डब्ल्यूएस समस्या है। मुझे एक ही सवाल है; यहां पूछा गया: http://weblogs.java.net/blog/jitu/archive/2008/08/control_of_jaxb.html#comment-813979 –

उत्तर

1

हमें एक्सिस के साथ समान समस्याएं थीं। हमारी समस्या यह थी कि हम वेब सेवा के लिए कई समवर्ती कॉल करना चाहते थे और डब्ल्यूएसडीएल का उपयोग करके उत्पन्न एक्सिस क्लाइंट्स ने प्रत्येक ग्राहक को बहुत मेमोरी का उपयोग करने के लिए प्रेरित किया था। ग्राहक थ्रेड सुरक्षित नहीं हैं, इसलिए हमें प्रति अनुरोध एक क्लाइंट बनाना था।

हमारे पास दो विकल्प थे। सबसे पहले हम जेनरेट कोड को छीन सकते थे - लेकिन यह रखरखाव के कारणों के लिए अच्छा नहीं था।

दूसरा, हमने उन हिस्सों को हटाने के लिए डब्लूएसडीएल को आसानी से हटा दिया जो हमारे लिए प्रासंगिक नहीं थे, और ग्राहकों को पतला कर दिया गया। इस तरह, अगर हम एक सेवा विधि कहते हैं, तो उसके ग्राहक में असंबंधित तरीकों के लिए थोक नहीं होगा जिसमें वह धागा उपयोग नहीं करेगा।

काफी अच्छी तरह से काम किया, लेकिन अभी भी एक रखरखाव दुःस्वप्न है, क्योंकि किसी भी समय डब्लूएसडीएल अपडेट हो जाता है (उदाहरण के लिए हमारे साथी अपनी वेब सेवा का एक नया संस्करण जारी करते हैं), हमें कटौती wsdls बनाने में समय बिताने की जरूरत है। आदर्श समाधान मुझे लगता है कि हमारे साथी को हमारी समस्याओं को पहचानने और डब्लूएसडीएल को काटने का स्वामित्व लेना होगा।

0

हमने सीएक्सएफ क्लाइंट के लिए एक अलग दृष्टिकोण लिया। मैंने अपनी स्मृति पदचिह्न में नहीं देखा है, जो हमारे संदर्भ में कोई मुद्दा नहीं है, लेकिन यह निश्चित रूप से स्टब्स बनाने के बजाय विकास का एक आसान तरीका है। यह इस तरह दिखता है:

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 के लिए (बेशक हम चीजों को आगे सरल करने के लिए कुछ उपयोगिता वर्गों का निर्माण किया है) हम क्रम (बशर्ते पर अप करने के लिए हुक करने ज़ाहिर है, चाहते हैं, हम इसका जावा इंटरफ़ेस है)। हमारा लक्ष्य पूरी डब्ल्यूएस चीज को जितना संभव हो सके प्रोग्रामर के लिए पारदर्शी बनाना था। हमें वास्तव में डब्लूएसडीएल और एक्सएसडी प्रति से में कोई रूचि नहीं है। हमें संदेह है कि हम अकेले नहीं हैं।

+0

मेरे मामले में वेब सेवा स्वयं एक .NET वेब सेवा है इसलिए कोई जावा इंटरफ़ेस नहीं है। –

0

यदि आपकी एसओएपी जरूरतें बहुत बुनियादी हैं, तो आप केएसओएपी 2 देख सकते हैं जो वास्तव में स्मृति कुशल है। यह जे 2 एमई फोन एप्लिकेशन में ठीक चलाने के लिए डिज़ाइन किया गया है।

संबंधित मुद्दे