2012-03-29 14 views
16

मेरे पास एक प्रोग्राम है जो WSDL द्वारा परिभाषित दूरस्थ सेवा को कॉल करने के लिए javax.xml.ws.Service का उपयोग करता है। यह प्रोग्राम Google App Engine पर चलता है, जो डिफ़ॉल्ट रूप से, HTTP कनेक्शन टाइमआउट को 5 सेकंड {1} पर सेट करता है। मुझे इस टाइमआउट मान को बढ़ाने की ज़रूरत है क्योंकि इस सेवा को अक्सर जवाब देने में काफी समय लगता है, लेकिन चूंकि यह अनुरोध URLConnection के साथ नहीं बनाया जा रहा है, इसलिए मैं यह नहीं समझ सकता कि URLConnection.setReadTimeout(int) {2} कैसे कॉल करें या अन्यथा टाइमआउट बदलें।क्या मैं वैश्विक स्तर पर HTTP कनेक्शन का टाइमआउट सेट कर सकता हूं?

क्या ऐप इंजन पर HTTP कनेक्शन टाइमआउट को वैश्विक रूप से सेट करने का कोई तरीका है? और, ज्ञान साझा करने के प्रयोजनों के लिए, आम तौर पर इस तरह की समस्या को हल करने के बारे में कोई कैसे होगा?

{1}: https://developers.google.com/appengine/docs/java/urlfetch/overview#Requests

{2}: http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html#setReadTimeout(int)

उत्तर

4

देखें https://developers.google.com/appengine/docs/java/urlfetch/usingjavanet

आप कुछ इस तरह कर सकते हैं एक URLConnection पाने के लिए: इस प्रयास करें

URL url = new URL("http://www.example.com/atom.xml"); 
    URLConnection tempConnection = url.openConnection(); 
    tempConnection.setReadTimeout(10); 
+0

संपूर्ण मुद्दा यह है कि 'URLConnection' ऑब्जेक्ट मेरे लिए कभी उपलब्ध नहीं है। अनुरोध एक अपारदर्शी तरीके से किया गया है जो 'javax.xml.ws.Service' –

8

:

Port port = service.getPort(endPointInterface); //or another "getPort(...)" 
((BindingProvider) port).getRequestContext() 
    .put(BindingProviderProperties.REQUEST_TIMEOUT, 30); 
+0

का उपयोग करता है मैंने अभी तक यह कोशिश नहीं की है, लेकिन आपको उत्तर देने के लिए बाउंटी मिलती है जिसे मैंने अभी तक कहीं और नहीं देखा है। –

12

आप sun.net.client.defaultConnectTimeout और sun.net.client.defaultReadTimeout सिस्टम गुणों को here दस्तावेज करने का प्रयास कर सकते हैं, उदा।

System.setProperty("sun.net.client.defaultReadTimeout", "30000"); 
System.setProperty("sun.net.client.defaultConnectTimeout", "30000"); 

संपादित

क्षमा करें, बस फिर से पढ़ें और पाया यह Google अनुप्रयोग इंजन पर है। मुझे निश्चित रूप से पता नहीं है, लेकिन हाल ही में Google और ओरेकल के विवादास्पद रिश्ते को देखते हुए, मुझे लगता है कि जीएई ओरेकल जेवीएम नहीं चलाता है। यदि कोई अन्य एक समान समस्या में चलता है तो मैं इसे यहां छोड़ दूंगा।

+0

दस्तावेज़ीकरण से लिंक: http://docs.oracle.com/javase/6/docs/technotes/guides/net/properties.html –

1

जेएक्स-डब्ल्यूएस के साथ ऐप इंजन के लिए आपको अनुरोध संदर्भ सेट करना होगा (आज एसडीके 1.9.15 के साथ परीक्षण किया गया है)। सामान्य मशीनों के लिए आप 60 से अधिक नहीं जा सकते हैं और कार्य कतार का बेहतर उपयोग करने के लिए बड़ी मशीनों (बीएक्स) पर स्विच करना होगा।

स्थानीय परीक्षण के लिए आप आमतौर पर बाइंडिंगप्रोवाइडरप्रॉपर्टीज का उपयोग करेंगे। CONNECT_TIMEOUT और BindingProviderProperties.REQUEST_TIMEOUT, लेकिन वे ऐप इंजन जेआरई व्हाइट लिस्ट पर नहीं हैं और आपका कोड निरीक्षण आपको इसके बारे में लगातार चेतावनी दे सकता है। बराबर तार हालांकि इस्तेमाल किया जा सकता:

com.sun.xml.ws.connect.timeout 
com.sun.xml.ws.request.timeout 

एक पूर्ण उदाहरण कैसे JAX-WS 2.x से स्वत: जनरेट कोड को लागू करने के लिए है कि, मान:

com.sun.xml.internal.ws.connect.timeout 
com.sun.xml.internal.ws.connect.timeout 

तैनाती के लिए अनुप्रयोग इंजन मिलीसेकंड में प्रदान किया जाना है:

@WebEndpoint(name = "Your.RandomServicePort") 
public YourServiceInterface getYourRandomServicePort() { 
    YourRandomServiceInterface port = super.getPort(YOURRANDOMSERVICE_QNAME_PORT, YourRandomServiceInterface.class); 
    Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext(); 
    requestContext.put("com.sun.xml.ws.connect.timeout", 10000); 
    requestContext.put("com.sun.xml.ws.request.timeout", 10000); 
    return port; 
} 
संबंधित मुद्दे

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