2012-12-20 20 views
15

WebService İstemcisi üzerinde çalışıyorum ve WebService Çağrısı için bir Zaman Aşımı ayarlamak istiyorum. Farklı yaklaşımları denedim ama yine de bunu başaramıyorum. WSDL'den kod oluşturma için JAX-WS kullanıyorum. JBoss-eap-5.1'i Uygulama Sunucusu ve JDK1.6.0_27 olarak kullanıyorum. Zaman aşımı için bu farklı yaklaşımları buldum ama hiçbiri benim için çalışmıyor. Şimdi ben ne yaptım İçin JAX-WS WebService Çağrısı için Zaman Aşımı Nasıl Ayarlanır


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."); 

, ben bir vasiyet içinden benim webservice yöntemi çağrıda edilir. Onun iyi bir yaklaşım olmadığını biliyorum, ama benim için çalışıyor. Çocuklar lütfen bunu doğru bir şekilde yapmam için bana yardım edin.

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

:

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(); 
     } 

cevap

18

Sen

BindingProviderProperties.REQUEST_TIMEOUT 
BindingProviderProperties.CONNECT_TIMEOUT 

BindingProviderProperties dizeleri for JBosscom.sun.xml.internal.WS.client

Veya uzak olmalıdır (bunlar çiftler halinde kullanılmak üzere eşleştirilmiş) bu ayarları deneyebilirsiniz Tüm özellikler getRequestContext() üzerine yerleştirilecek milisaniye.

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

JBoss belirtmek gerekirse org.jboss.ws.core.StubExt malını StubExt.PROPERTY_CLIENT_TIMEOUT kullanmak isteyebilirsiniz için

. Detaylar için bkz. this thread.

+1

StubExt.PROPERTY_CLIENT_TIMEOUT benim için çalıştı, ancak istisna içindir sonra '3 * timeoutMillisecond' atılır com.sun.xml.internal.ws.developer.JAXWSProperties yukarıdaki alanların

Değerler Örnek: Eğer 9000 milisaniye sonra istisna haricinde timeoutMillisecond = 3000' ise, ancak 'Timeout: 3000ms' günlük dosyasına yazılır – mariami

+0

Teşekkürler @mariami Benim için çalıştı. Ve istisna 3 * timeoutMillisecond sonra değil, uygun zamanda atılıyor. Çalışmak için olsa da jax ile ilgili jboss lib gelen bazı kavanoz kaldırmak zorunda kaldı aksi halde NoClassDefFoundError: javax/xml/ws/spi/Provider21 veriyordu. –

2

Yükseltme jbossws-yerli kütüphane ve jbossws-yerli, bu link izleyin yükseltme için StubExt.PROPERTY_CLIENT_TIMEOUT

kullanın.

* jbossws-native-3.4.0, Jboss 5.1.0GA için en son desteklenen sürümdür.

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

Ve dize değerleri şunlardır:

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

iç paketler kullanılmamalıdır rağmen Sen

5

gibi Kolossus kullanmak gerektiğini söyledi Bu benim için çalıştı JBossWS - Supported Target Containers

görebilirsiniz Varsayılan JDK6 ile çalışmanızın tek yolu budur. Yani, almak ve zaman aşımı bağlamak ayarı bu durumda ile yapılmalıdır: Diğer JAXWS referans uygulamasını kullanıyorsanız

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

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

Ama dikkatli olun, sabit değerler farklıdır, yani JAXWS-RT 2.1.4 BindingProviderProperties:

com.sun.xml.ws.client.BindingProviderProperties 

farklı dize REQUEST_TIMEOUT için değerleri ve connect_timeout sahip olacaktır:

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

Belirtilen zaman aşımının Tamsayı olarak verilmesi bekleniyor! – geld0r

2

F veya javax.xml.ws.client.connectionTimeout ve javax.xml.ws.client.receiveTimeout ayarlarında sorun çözüldü.

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

aşağıdaki seçenekleri benim için çalışır Ayar link

1

bakın. Metro JAXWS uygulamasını kullanıyorum.

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

portType, Web Service uç nokta arabirimidir.

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"; 
İlgili konular