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を使用)でこれを行う方法はありますか?
読み取りまたは接続ではなく書き込みでブロックされるため、この場合は該当しません。これらのタイムアウトはデフォルトで設定されます。私はSO_KEEPALIVEとの非同期接続に変更しました。完璧ではありませんが、システムのキープアライブ期間に基づいてタイムアウトする必要があります – wbdarby
私は非同期クライアントを使用したことがありません。ドキュメントを読むことはおそらくあなたの解決策はうまくいくようです。まず、SO_KEEPALIVEのタイムアウトをデフォルト値の2時間より低くする必要があると思います。それが動作すれば答えを投稿してください! – pedrofb