2016-12-07 10 views
1

今日、JavaベースのCXFクライアントがリモートソケットへの書き込みを中断していました。CXFで書き込みタイムアウトを検出して処理する方法

は、ここでの処理を示す略記スタックトレースは、CXFベースのJAX-WSインタフェースへの書き込みブロックされた次のとおり

java.net.SocketOutputStream.socketWrite0 
java.net.SocketOutputStream.socketWrite 
... 
org.apache.cxf.io.AbstractWrappedOutputStream.write 
org.apache.cxf.io.AbstractThresholdOutputStream.write 
... 
org.apache.cxf.jaxws.JaxWsClientProxy.invoke 
com.sun.proxy.$Proxy143.getAllBusLmp 
name.willdarby.trading.pjmService.PjmUpdateChecker.load5MinBus 

のnetstatは、ソケットが接続され、バッファを書き込みされる説明がいっぱいになる、次のように示した:

Proto Recv-Q Send-Q Local Address    Foreign Address    State 
tcp  482 182000 ip-xxx.xxx-xxx-xxx.ip.:41368 xxx.xxx.com:https ESTABLISHED 

私が理解するように、OSはソケットがまだ生きていると思ったので、書き込みがブロックされています。それは少なくとも45分間この状態にあった。 5分後にブロックされた書き込みを検出し、ソケットをリセットしたいと思います。 CXF(現バージョン3.1.4を使用)でこれを行う方法はありますか?

答えて

0

タイムアウトを設定すると、CXFは接続を中断します。

Client client = ClientProxy.getClient(proxy); 
HTTPConduit http = (HTTPConduit) client.getConduit(); 
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
httpClientPolicy.setConnectionTimeout(30000); // 30 seconds 
httpClientPolicy.setReceiveTimeout(300000); //5 minutes 
http.setClient(httpClientPolicy); 

パラメータの完全なリストはhereです。 0はタイムアウトがないことを意味します。

デフォルトの接続タイムアウトが30秒で、受信タイムアウトが60秒なので、それが正常に機能するかどうかは分かりません。そのため、中断されているはずです。

+0

読み取りまたは接続ではなく書き込みでブロックされるため、この場合は該当しません。これらのタイムアウトはデフォルトで設定されます。私はSO_KEEPALIVEとの非同期接続に変更しました。完璧ではありませんが、システムのキープアライブ期間に基づいてタイムアウトする必要があります – wbdarby

+0

私は非同期クライアントを使用したことがありません。ドキュメントを読むことはおそらくあなたの解決策はうまくいくようです。まず、SO_KEEPALIVEのタイムアウトをデフォルト値の2時間より低くする必要があると思います。それが動作すれば答えを投稿してください! – pedrofb