2012-12-20 46 views
15

मैं एक वेब सेवा क्लाइंट पर काम कर रहा हूं और मैं अपने वेब सेवा कॉल के लिए टाइमआउट सेट करना चाहता हूं। मैंने अलग-अलग दृष्टिकोणों की कोशिश की है लेकिन फिर भी मैं इसे हासिल करने में सक्षम नहीं हूं। मैं डब्ल्यूएसडीएल से कोड पीढ़ी के लिए जेएक्स-डब्ल्यूएस का उपयोग कर रहा हूं। मैं जेबॉस-एप-5.1 का उपयोग ऐप सर्वर और जेडीके 1.6.0_27 के रूप में कर रहा हूं। मुझे टाइमआउट सेट करने के लिए इन diff दृष्टिकोण मिलते हैं लेकिन उनमें से कोई भी मेरे लिए काम नहीं कर रहा है।जेएक्स-डब्ल्यूएस वेब सेवा कॉल के लिए टाइमआउट कैसे सेट करें

URL mbr_service_url = new URL(null,GlobalVars.MemberService_WSDL, new URLStreamHandler() { 

      @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); 
      } 
     }); 
     MemberService service = new MemberService(mbr_service_url); 
     MemberPortType soap = service.getMemberPort(); 
     ObjectFactory factory = new ObjectFactory(); 
     MemberEligibilityWithEnrollmentSourceRequest request = factory.createMemberEligibilityWithEnrollmentSourceRequest(); 

     request.setMemberId(GlobalVars.MemberId); 
     request.setEligibilityDate(value); 

     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.client.BindingProviderProperties.REQUEST_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.client.BindingProviderProperties.CONNECT_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.client.BindingProviderProperties.REQUEST_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.client.BindingProviderProperties.CONNECT_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.developer.JAXWSProperties.REQUEST_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.developer.JAXWSProperties.CONNECT_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.developer.JAXWSProperties.REQUEST_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.developer.JAXWSProperties.CONNECT_TIMEOUT, 10000); 
     System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); 
     System.setProperty("sun.net.client.defaultReadTimeout", "10000"); 

     MemberEligibilityWithEnrollmentSourceResponse response = soap.getMemberEligibilityWithEnrollmentSource(request); 
     logger.log("Call to member service finished."); 

अब मैं क्या किया है के लिए है, मैं एक प्रबंधक के अंदर से मेरी वेब सेवा विधि कहा जाता है। मुझे पता है कि यह एक अच्छा दृष्टिकोण नहीं है, लेकिन यह मेरे लिए काम कर रहा है। दोस्तों कृपया मुझे इसे उचित तरीके से करने में मदद करें।

logger.log("Parameters set for createorUpdateContact call.\nGoing in Executor Service."); 
     ExecutorService executorService = Executors.newSingleThreadExecutor(); 
     executorService.execute(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        response = soap.getMemberEligibilityWithEnrollmentSource(request); 
       } catch (MemberServiceException ex) { 
        logger.log("Exception in call to WebService", ex.fillInStackTrace()); 
       } 
      } 
     }); 
     executorService.shutdown(); 
     try { 
      executorService.awaitTermination(GlobalVars.WSCallTimeOut, TimeUnit.SECONDS); 
     } catch (InterruptedException ex) { 
      logger.log("Thread Interrupted!", ex); 
      executorService.shutdownNow(); 
     } 

उत्तर

18

आप इन सेटिंग्स की कोशिश कर सकते

BindingProviderProperties.REQUEST_TIMEOUT 
BindingProviderProperties.CONNECT_TIMEOUT 

BindingProviderProperties तार for JBoss से com.sun.xml.internal.WS.client

या होना चाहिए (वे जोड़े में प्रयोग की जाने वाली जोड़ा जाता है):

javax.xml.ws.client.connectionTimeout 
javax.xml.ws.client.receiveTimeout 

सभी गुण getRequestContext() पर रखा जाना चाहिए i एन मिलीसेकंड्स।

(BindingProvider)wsPort).getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, yourTimeoutInMillisec); 

JBoss विशेष रूप से, आप org.jboss.ws.core.StubExt से संपत्ति StubExt.PROPERTY_CLIENT_TIMEOUT उपयोग करने के लिए चाहते हो सकता है के लिए। विवरण के लिए this thread देखें।

+1

StubExt.PROPERTY_CLIENT_TIMEOUT मेरे लिए काम किया, लेकिन अपवाद के बाद ही '3 * timeoutMillisecond' के लिए फेंक दिया जाता है से ऊपर के खेतों के

मान उदाहरण: यदि 9000 मिलीसेकंड के बाद अपवाद से 'टाइमआउटमिलिसकंड = 3000' फेंक दिया गया है, लेकिन' टाइमआउट के बाद: 3000 एमएस 'लॉग फ़ाइल – mariami

+0

में लिखा गया है धन्यवाद @ मारियामी यह मेरे लिए काम करता है। और अपवाद उचित समय पर फेंक दिया जा रहा है, 3 * टाइमआउट Millisecond के बाद नहीं। यद्यपि इसे काम करने के लिए मुझे जैक्स से संबंधित jboss lib से कुछ जार हटा देना था अन्यथा यह NoClassDefFoundError: javax/xml/ws/spi/Provider21 दे रहा था। –

2

अपग्रेड jbossws देशी पुस्तकालय और StubExt.PROPERTY_CLIENT_TIMEOUT

का उपयोग उन्नयन jbossws देशी, इस link अनुसरण करें।

* jbossws-native-3.4.0 जेबॉस 5.1.0GA के लिए नवीनतम समर्थित संस्करण है। आप देख सकते हैं JBossWS - Supported Target Containers

यह मेरे लिए काम किया

5

तरह kolossus कहा था कि आप उपयोग करना चाहिए:

com.sun.xml.internal.ws.client.BindingProviderProperties  

और स्ट्रिंग मान हैं:

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

हालांकि आंतरिक संकुल नहीं किया जाना चाहिए , यदि आप डिफ़ॉल्ट जेडीके 6 के साथ काम करते हैं तो यह एकमात्र तरीका है। इसलिए, इस मामले प्राप्त करते हैं और समय समाप्ति कनेक्ट की स्थापना में से किया जाना चाहिए: यदि आप अन्य JAXWS संदर्भ कार्यान्वयन का उपयोग कर रहे

bindingProvider.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT,requestTimeoutMs); 

bindingProvider.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT,connectTimeoutMs); 

लेकिन सावधान रहना, लगातार मान भिन्न हैं, यानी JAXWS-आर टी 2.1.4 BindingProviderProperties:

com.sun.xml.ws.client.BindingProviderProperties 

आप और REQUEST_TIMEOUT के लिए अलग स्ट्रिंग मान CONNECT_TIMEOUT होगा:

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

ध्यान दें कि दिया गया टाइमआउट इंटीजर के रूप में दिया जाने की उम्मीद है! – geld0r

2

एफ या मुझे javax.xml.ws.client.connectionTimeout और javax.xml.ws.client.receiveTimeout सेटिंग को हल करने की समस्या है।

((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", timeout); 
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", timeout); 

निम्नलिखित विकल्पों मेरे लिए काम करता स्थापना का उल्लेख link

1

। मैं मेट्रो JAXWS कार्यान्वयन का उपयोग कर रहा हूँ।

((BindingProvider)portType).getRequestContext().put(JAXWSProperties.CONNECT_TIMEOUT, 10000); 
((BindingProvider) portType).getRequestContext().put(JAXWSProperties.REQUEST_TIMEOUT, 50000); 

पोर्टटाइप वेब सेवा एंडपॉइंट इंटरफ़ेस है। com.sun.xml.internal.ws.developer.JAXWSProperties

public static final java.lang.String CONNECT_TIMEOUT = "com.sun.xml.internal.ws.connect.timeout"; 
public static final java.lang.String REQUEST_TIMEOUT = "com.sun.xml.internal.ws.request.timeout";