2013-01-31 1 views
14

を時間を読み出すことができませんでした:私はwsにSOAPリクエストを送信した後、それは通常は発生しApacheのCXFは、メッセージを送信するとの原因である可能性がありますどのような

org.apache.cxf.interceptor.Fault: Could not send Message.

Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking https://xxx.xxx.xxx.xxx:8443/services/test: Read timed out

。私はapache cxfを使用しています。私は完全にwsが起動していることを確信しています。タイムアウトが発生する前にクライアントは2つの要求を送信するからです。タイムアウトは、3番目のSOAPリクエストで発生します。

答えて

10

エラーメッセージは、Webサービスクライアントがネットワーク経由でリモートWebサービスからデータを受信しようとしたが、特定の期間データが受信されなかったため、Webサービスクライアントはデータの待機を停止しました。受け取る。

考えられる原因の1つは、timeoutプロパティが低すぎる可能性があります。デフォルトでは、cxfのデフォルト値はそれぞれ30000および60000 msです。これらは、クライアントの作成方法に応じて変更できます。あなたは、Javaコードを使用してクライアントを作成する場合は

あなたが使用することができます:あなたが春を使用している場合

//1 minute for connection 
((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.connect.timeout", 1 * 60 * 1000); 

//3 minutes for request 
((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.request.timeout", 3 * 60 * 1000); 

、あなたがこのようなマップを使用することができます。

<util:map id="jaxwsProperties"> 
    <entry key="com.sun.xml.internal.ws.request.timeout"> 
     <value type="java.lang.Integer">120000</value> 
    </entry> 
    <entry key="com.sun.xml.internal.ws.connect.timeout"> 
     <value type="java.lang.Integer">60000</value> 
    </entry> 
</util:map> 

はその後にそのマップを設定します<jaxws:client.../>の設定

+0

大丈夫病気とにかく間違ったSOAPリクエスト形式もできるエラーの犯人?? ,,私は偶然ヌルでSOAPリクエストを送信しすることができます:)ことをしてみてくださいvalues/""値が返されました。私は突然ws soapレスポンスを受け取りました。 – irumi

+2

プロパティの名前がそれぞれ 'javax.xml.ws.client.connectionTimeout'と' javax.xml.ws.client.receiveTimeout'に変更されました。 –

14

このエラーもWebサービスクライアントで発生しました。私のために働いた解決策は、httpクライアントをCXF設定ファイル(cxf.xml)で設定することです。

Apache CXF documentに記載されるように:

1.Add HTTP-導管名前空間およびxsd:

<beans ... 
     xmlns:http-conf="http://cxf.apache.org/transports/http/configuration 
     ... 
     xsi:schemaLocation="... 
      http://cxf.apache.org/transports/http/configuration 
      http://cxf.apache.org/schemas/configuration/http-conf.xsd 
     ..."> 

2.Add HTTP-導管タグ/要素及び/ RecieveTimeoutを設定しますConnectionTimeoutから180000msへ:

<http-conf:conduit name="*.http-conduit"> 
     <http-conf:client 
         ConnectionTimeout="300000" 
         ReceiveTimeout="300000"/>  
</http-conf:conduit> 
0

Apache CXF srcからreceiveTimeout設定を変更し、サーバーの既存のcxf-rt-transports-http-version.jarを置き換えることができます。

簡単な指示:(Wildfly 8.2/undertow read time outからの指示を得た)

  1. ダウンロードCXF2.7.16のSRC apacheの
  2. からはpermgenエラー
  3. を修正するためにPATHに
  4. 輸出MAVEN_OPTS = -Xmx512mをMavenの/ binを追加します
  5. ./rt/transports/http/src/main/resources/schemas/wsdl/http-conf.xsdを開いて、ReceiveTimeoutを60000から例えば必要なものに変更します。 600000(10分)
  6. mvn -Pfastinstallを実行する
  7. 「パッチ適用済み」cxf-rt-transports-http-2.7を入手してください。16./js/rt/transports/http/targetフォルダから
  8. サーバにcxf-rt-transports-http-2.7.16.jarを置き換えてください。たとえば、wildfly8.2では./modules/system/layers/base/org/apache/cxf/impl/mainフォルダにあり、同じフォルダ内のmodule.xmlを更新して、このパッチが適用されたcxf-rtを使用するようにしてください-transports-http-2.7.16.jar。

これは、サーバーで使用される基盤となるApache CXFによって引き起こされるSocketTimeoutExceptionを解決するはずです。

2

別approche設定タイムアウト(プログラム的)に:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
Object serviceClass = factory.create(); 
defineTimeouts(serviceClass); 

static void defineTimeouts(Object serviceClass) { 
    Client cxfClient = ClientProxy.getClient(serviceClass); 
    HTTPConduit httpConduit = (HTTPConduit) cxfClient.getConduit(); 

    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
    httpClientPolicy.setConnectionTimeout(DEFAULT_CLIENT_CONNECTION_TIMEOUT); 
    httpClientPolicy.setReceiveTimeout(DEFAULT_CLIENT_RECEIVE_TIMEOUT); 
    httpConduit.setClient(httpClientPolicy); 
} 
関連する問題