मैं JAX-WS webservice क्लाइंट के लिए टाइमआउट कैसे सेट करूं?


93

WSDL के आधार पर, मैंने अपनी वेब सेवा के लिए इंटरफ़ेस बनाने के लिए JAXWS-RI 2.1 का उपयोग किया है। मैं वेब सेवा के साथ कोई समस्या नहीं कर सकता, लेकिन वेब सेवा के लिए अनुरोध भेजने के लिए कोई समय सीमा निर्दिष्ट नहीं कर सका। यदि किसी कारण से यह ग्राहक को जवाब नहीं देता है तो यह हमेशा के लिए घूमता है।

आसपास शिकार करने से पता चला है कि मुझे शायद कुछ ऐसा करने की कोशिश करनी चाहिए:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);

मुझे यह भी पता चला कि आपके पास JAXWS-RI के किस संस्करण के आधार पर, आपको इन गुणों को सेट करने की आवश्यकता हो सकती है:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);

मेरे पास जो समस्या है, वह यह है कि उपरोक्त में से कोई भी सही होने के बावजूद, मुझे नहीं पता कि मैं यह कहां कर सकता हूं। मेरे पास Serviceसबकुछ एक उपवर्ग है, जो ऑटो-जेनरेट किए गए इंटरफ़ेस को webservice पर लागू करता है और इस बिंदु पर कि यह अस्थिर हो रहा है, अगर WSDL गैर-उत्तरदायी है, तो पहले से ही गुण सेट करने में बहुत देर हो चुकी है:

MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();

क्या कोई मुझे सही दिशा दिखा सकता है?!


5
मुझे नहीं लगता कि मेरे पास आपके लिए कोई जवाब है, लेकिन आपके सवाल से मुझे अपनी समस्या हल करने में मदद मिली। मैं com.sun.xml.ws.request.timeout संपत्ति के बारे में जानता था, लेकिन com.sun.xml.internal.ws.request.timeout के बारे में नहीं।
रॉन टफिन

जवाबों:


89

मुझे पता है कि यह पुराना है और कहीं और उत्तर दिया गया है लेकिन उम्मीद है कि यह इसे बंद कर देगा। मुझे यकीन नहीं है कि आप डब्लूएसडीएल को गतिशील रूप से डाउनलोड करना चाहते हैं लेकिन सिस्टम गुण:

sun.net.client.defaultConnectTimeout (default: -1 (forever))
sun.net.client.defaultReadTimeout (default: -1 (forever))

HttpURLConnection जो JAX-WS का उपयोग करता है का उपयोग करके सभी रीड्स और कनेक्ट पर लागू होना चाहिए। यदि आप WSDL को दूरस्थ स्थान से प्राप्त कर रहे हैं तो यह आपकी समस्या का समाधान करना चाहिए - लेकिन आपकी स्थानीय डिस्क पर एक फ़ाइल शायद बेहतर है!

अगला, यदि आप विशिष्ट सेवाओं के लिए टाइमआउट सेट करना चाहते हैं, तो एक बार जब आप अपना प्रॉक्सी बना लेते हैं, तो आपको इसे एक बाइंडिंगप्रोइडर (जिसे आप पहले से जानते हैं) को डालना होगा, अनुरोध संदर्भ प्राप्त करें और अपने गुणों को सेट करें। ऑनलाइन JAX-WS प्रलेखन गलत है, ये सही संपत्ति के नाम हैं (ठीक है, वे मेरे लिए काम करते हैं)।

MyInterface myInterface = new MyInterfaceService().getMyInterfaceSOAP();
Map<String, Object> requestContext = ((BindingProvider)myInterface).getRequestContext();
requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 3000); // Timeout in millis
requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 1000); // Timeout in millis
myInterface.callMyRemoteMethodWith(myParameter);

बेशक, यह चीजों को करने का एक भयानक तरीका है, मैं इन बाध्यकारी प्रदाताओं के उत्पादन के लिए एक अच्छा कारखाना बनाऊंगा जिन्हें आपके द्वारा इच्छित समय के साथ इंजेक्ट किया जा सकता है।


10
ध्यान दें कि REQUEST_TIMEOUT / CONNECT_TIMEOUT गुणों को वास्तव में SUN-आंतरिक वर्ग com.sun.xml.internal.ws.developer.JAXWSProperties से विरासत में मिला है और (कम से कम 32-बिट लिनक्स) javac 1.6.0_27 और javac 1.7.0_03 विफल। इस कोड को संकलित करें ( Bugs.sun.com/view_bug.do?bug_id=6544224 के समान ) ... आपको इसे बनाने के लिए javac -XDignore.symbol.file पास करने की आवश्यकता है।
जावागु

क्या काम नहीं करता है? मैंने बस इसे डबल चेक किया और यह मेरे लिए काम कर रहा है।
अल्पियन

बस यह पुष्टि करते हुए कि मैंने सिर्फ JAX-WS RI 2.2.8 और JDK 1.7 के साथ इसका उपयोग किया है और यह ठीक काम किया है। धन्यवाद!
बोकेनेन

कक्षाएं और पैरामीटर जिनके पास पूरी तरह से योग्य नाम में "आंतरिक" है, का उपयोग नहीं किया जाना चाहिए, क्योंकि विक्रेता-निर्भर हैं और इस प्रकार विभिन्न जेडीके कार्यान्वयनों के बीच पोर्टेबल नहीं हैं। उदाहरण के लिए, jax-ws पैरामीटर के मामले में, इसी गैर-आंतरिक गुण com.sun.xml.ws.client.BindingProviderProperties वर्ग में मौजूद हैं।
पोलेरेटो

1
@ Matt1776 हाँ यह याद आ रहा है: जबकि JAX-WS एक API विनिर्देशन है, आपको एक पुस्तकालय कार्यान्वयन की आवश्यकता है, इस मामले में jaxws-ri.jar या jaxws-rt.jar, जो JDK का हिस्सा नहीं है। आपको बस इसे अपने ptoject में डाउनलोड और जोड़ना होगा और आपके पास वे गुण उपलब्ध होंगे।
पोलेरेटो

40

स्वीकृत उत्तर में गुण मेरे लिए काम नहीं करते, संभवतः इसलिए कि मैं JAX-WS के JBoss कार्यान्वयन का उपयोग कर रहा हूं?

गुणों के एक अलग सेट का उपयोग करना ( JBoss JAX-WS उपयोगकर्ता गाइड में पाया गया ) ने इसे काम किया:

//Set timeout until a connection is established
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", "6000");

//Set timeout until the response is received
((BindingProvider) port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", "1000");

2
मैं JBoss का उपयोग नहीं कर रहा हूं, लेकिन इस टिप्पणी में केवल गुणों ने मेरे लिए काम किया, और कुछ नहीं किया।
पॉल

2
संपत्ति के नाम JAX-WS कार्यान्वयन पर निर्भर करते हैं। एक सूची यहां देखी
fabstab

3
java.net लिंक टूट गया है। github.com/javaee/metro-jax-ws/issues/1166
trunkc

12

यहाँ मेरा काम कर समाधान है:

// --------------------------
// SOAP Message creation
// --------------------------
SOAPMessage sm = MessageFactory.newInstance().createMessage();
sm.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "true");
sm.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "UTF-8");

SOAPPart sp = sm.getSOAPPart();
SOAPEnvelope se = sp.getEnvelope();
se.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");
se.setAttribute("xmlns:SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/");
se.setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
se.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");

SOAPBody sb = sm.getSOAPBody();
// 
// Add all input fields here ...
// 

SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection();
// -----------------------------------
// URL creation with TimeOut connexion
// -----------------------------------
URL endpoint = new URL(null,
                      "http://myDomain/myWebService.php",
                    new URLStreamHandler() { // Anonymous (inline) class
                    @Override
                    protected URLConnection openConnection(URL url) throws IOException {
                    URL clone_url = new URL(url.toString());
                    HttpURLConnection clone_urlconnection = (HttpURLConnection) clone_url.openConnection();
                    // TimeOut settings
                    clone_urlconnection.setConnectTimeout(10000);
                    clone_urlconnection.setReadTimeout(10000);
                    return(clone_urlconnection);
                    }
                });


try {
    // -----------------
    // Send SOAP message
    // -----------------
    SOAPMessage retour = connection.call(sm, endpoint);
}
catch(Exception e) {
    if ((e instanceof com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl) && (e.getCause()!=null) && (e.getCause().getCause()!=null) && (e.getCause().getCause().getCause()!=null)) {
        System.err.println("[" + e + "] Error sending SOAP message. Initial error cause = " + e.getCause().getCause().getCause());
    }
    else {
        System.err.println("[" + e + "] Error sending SOAP message.");

    }
}

3
क्या ये विन्यास "javax.xml.ws.client.connectionTimeout" और "javax.xml.ws.client.receiveTimeout" के बराबर हैं ??
जोस टेपडिनो

11
ProxyWs proxy = (ProxyWs) factory.create();
Client client = ClientProxy.getClient(proxy);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(0);
httpClientPolicy.setReceiveTimeout(0);
http.setClient(httpClientPolicy);

इसने मेरे लिए काम किया।


धन्यवाद! मेरे लिए भी, यह एक बहुत ही आसान तरीका है
kosm

4
यह अपाचे सीएक्सएफ कक्षाओं का उपयोग करता है, हालांकि, उत्तर में इसे जोड़ना सबसे अच्छा हो सकता है। एक लिंक जिससे सीएक्सएफ जार शामिल हैं, वे भी बहुत मदद करेंगे।
JBert

@JBert मैं सहमत हूं। मैं इस साल पहले जवाब दिया और याद नहीं कर सकते। जवाब को संपादित करने के लिए स्वतंत्र महसूस करें।
डैनियल कपलान

8

यदि आप JDK6 पर JAX-WS का उपयोग कर रहे हैं, तो निम्नलिखित गुणों का उपयोग करें:

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

System.setProperty ("com.sun.xml.internal.ws.connect.timeout", "300"); System.setProperty ("com.sun.xml.internal.ws.request.timeout", "300") ने मेरे लिए काम किया।
2787184

2
कुछ संदर्भों में, आप प्रोग्रामिंग-टाइम को नहीं जानते हैं जो JAXWS संस्करण (आंतरिक या स्टैंडअलोन) रन-टाइम का उपयोग किया जाएगा। इस समय-सुविधा को छोड़कर, दोनों काफी संगत हैं। कुंजियाँ भिन्न हैं ( com.sun.xml.internal.ws.connect.timeoutबनाम com.sun.xml.ws.connect.timeout) भी वर्ग (या इंटरफ़ेस) जो उन्हें परिभाषित करते हैं ( com.sun.xml.internal.ws.developer.JAXWSProperties/ com.sun.xml.internal.ws.client.BindingProviderPropertiesबनाम com.sun.xml.ws.developer.JAXWSProperties/ com.sun.xml.ws.client.BindingProviderProperties)। मेरा सबसे अच्छा विचार दोनों को स्थापित करना है, कुंजी के रूप में शाब्दिक मूल्यों का उपयोग करना।
लोरिनज़ी ज़िग्डमंड

5

यदि आपका अभिभाषक वेबलॉजिक है (मेरे लिए यह 10.3.6 था) तो टाइमआउट के लिए जिम्मेदार गुण हैं:

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

3

यकीन नहीं होता कि इससे आपके संदर्भ में मदद मिलेगी ...

क्या साबुन वस्तु को BindingProvider के रूप में डाला जा सकता है?

MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
// set timeouts here
((BindingProvider)soap).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
    soap.sendRequestToMyWebService();

दूसरी ओर यदि आप MyWebService ऑब्जेक्ट के इनिशियलाइज़ेशन पर टाइमआउट सेट करना चाहते हैं तो यह मदद नहीं करेगा।

मेरे लिए यह तब काम किया जब व्यक्तिगत वेबसर्वर कॉल को टाइमआउट करना चाहते थे।


2

दूरस्थ WSDL की धीमी पुनर्प्राप्ति से बचने का सबसे आसान तरीका है जब आप अपने SEI को तुरंत चलाते हैं तो WSDL को रनटाइम पर दूरस्थ सेवा समापन बिंदु से पुनर्प्राप्त नहीं करना है।

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

जब मैं अपने क्लाइंट स्टब्स उत्पन्न करता हूं, तो मैं JAX-WS रनटाइम को SEI को इस तरह से एनोटेट करने के लिए कहता हूं कि यह वर्गपाठ पर पूर्व निर्धारित स्थान से WSDL को पढ़ेगा। डिफ़ॉल्ट रूप से स्थान सेवा SEI के पैकेज स्थान के सापेक्ष है


<wsimport
    sourcedestdir="${dao.helter.dir}/build/generated"
    destdir="${dao.helter.dir}/build/bin/generated"
    wsdl="${dao.helter.dir}/src/resources/schema/helter/helterHttpServices.wsdl"
    wsdlLocation="./wsdl/helterHttpServices.wsdl"
    package="com.helter.esp.dao.helter.jaxws"
    >
    <binding dir="${dao.helter.dir}/src/resources/schema/helter" includes="*.xsd"/>
</wsimport>
<copy todir="${dao.helter.dir}/build/bin/generated/com/helter/esp/dao/helter/jaxws/wsdl">
    <fileset dir="${dao.helter.dir}/src/resources/schema/helter" includes="*" />
</copy>

wsldLocation विशेषता एसईआई को बताता है कि डब्ल्यूएसडीएल कहां मिल सकता है, और प्रतिलिपि सुनिश्चित करती है कि wsdl (और xsd का समर्थन कर रहा है .. आदि) सही स्थान पर है।

चूंकि स्थान SEI के पैकेज स्थान के सापेक्ष है, हम एक नया उप-पैकेज (निर्देशिका) बनाते हैं, जिसे wsdl कहा जाता है, और वहां सभी wddl कलाकृतियों को कॉपी करें।

इस बिंदु पर आपको बस इतना करना होगा कि आप सभी * .wsdl, * .xsd को सभी * .class के अलावा शामिल करें जब आप अपना क्लाइंट-स्टब विरूपण साक्ष्य जार फ़ाइल बनाते हैं।

(आपके उत्सुक होने पर, @webserviceClient एनोटेशन वह जगह है जहां यह wsdl स्थान वास्तव में जावा कोड में सेट है

@WebServiceClient(name = "httpServices", targetNamespace = "http://www.helter.com/schema/helter/httpServices", wsdlLocation = "./wsdl/helterHttpServices.wsdl")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.