title: How to Set Timeout for JAX-WS WebService Call
body: <p>I'm working on a WebService Client and I want to set a Timeout for my WebService Call. I have tried different approaches but still I'm not able to achieve this. I'm using JAX-WS for code generation from WSDL. I'm using JBoss-eap-5.1 as App Server and JDK1.6.0_27. I found these diff approaches for setting timeout but none of them is working for me.</p>
  
  <pre><code>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.");
  </code></pre>
  
  <hr>
  
  <p>For now what I have done is, I have called my webservice method from inside an executor. I know its not a good approach, but its working for me. Guys please help me to do it in a proper way.</p>
  
  <pre><code>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();
          }
  </code></pre>