2012-12-20 10 views
15

WebServiceクライアントで作業していて、WebServiceコールのタイムアウトを設定したいとします。私はさまざまなアプローチを試みましたが、それでも私はこれを達成することができません。 WSDLからのコード生成にJAX-WSを使用しています。私はJBoss-eap-5.1をApp ServerとJDK1.6.0_27として使用しています。私はタイムアウトを設定するためにこれらのdiffのアプローチを見つけましたが、どれも私のために働いていません。今私がやっていることについては JAX-WS WebServiceコールのタイムアウトを設定する方法


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

は、私はエグゼキュータの中から自分のWebサービスメソッドを呼び出しています。私はそれが良いアプローチではなく、私のために働いていることを知っています。皆さん、私が適切な方法でそれをやるのを手伝ってください。

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

あなたはcom.sun.xml.internal.WS.client

または文字列for JBossからでなければなりません

BindingProviderProperties.REQUEST_TIMEOUT 
BindingProviderProperties.CONNECT_TIMEOUT 

BindingProviderProperties(これらはペアで使用されるように対になっている)、これらの設定を試みることができる:

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

すべてのプロパティは、上に置くgetRequestContext()私はnミリ秒。 JBossの

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

具体的には、あなたはorg.jboss.ws.core.StubExtからプロパティStubExt.PROPERTY_CLIENT_TIMEOUTを使用する場合があります。詳細は、this threadを参照してください。

+1

はStubExt.PROPERTY_CLIENT_TIMEOUTは私のために働いたが、例外がためだけ '3 * timeoutMillisecond' 後にスローされます。例:例外よりも 'timeoutMillisecond = 3000'が9000ミリ秒後にスローされるが、' Timeout after:3000ms'がログファイルに書き込まれる – mariami

+0

ありがとう@mariamiそれは私のために働いた。 3 * timeoutMillisecondの後ではなく、適切な時に例外がスローされます。それを動作させるためには、jaxに関連するjboss libからいくつかのjarを削除しなければなりませんでした。それ以外の場合、NoClassDefFoundError:javax/xml/ws/spi/Provider21を与えていました。 –

2

アップグレードはJBossWS-ネイティブライブラリとのJBossWSネイティブは、このlinkに従ってくださいアップグレードするためStubExt.PROPERTY_CLIENT_TIMEOUT

を使用しています。

* jbossws-native-3.4.0は、Jboss 5.1.0GAの最新のサポートされているバージョンです。

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

と文字列値は次のとおりです:

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

内部のパッケージは使用すべきではありませんが、あなたは

5

ようkolossusはあなたが使用する必要があると述べた。これは私のために働いたJBossWS - Supported Target Containers

を見ることができますこれは、デフォルトのJDK6で作業する場合の唯一の方法です。だから、受信タイムアウトを接続設定この場合に行われる必要があります:あなたは、他のJAXWSリファレンス実装を使用している場合

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

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

しかし、注意してください、定数の値が異なっている、すなわちJAXWS-RT 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

与えられたタイムアウトはIntegerとして与えられることに注意してください! – geld0r

2

Fをまたは私はjavax.xml.ws.client.connectionTimeoutjavax.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

を参照してください。私はMetro JAXWS実装を使用しています。

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

portTypeはWebサービスエンドポイントインターフェイスです。 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"; 
関連する問題