JAX-RS Web サービスの JUnit テストがあります。このテストは、組み込みの tomcat を起動し、Apache CXF JAX-RS クライアントを介してそれと通信します。
このバックトレースを考えてみましょう:
Caused by: java.net.SocketException: Socket Closed
at java.net.PlainSocketImpl.getOption(PlainSocketImpl.java:286)
at java.net.Socket.getSoTimeout(Socket.java:1032)
at sun.net.www.http.HttpClient.available(HttpClient.java:356)
at sun.net.www.http.HttpClient.New(HttpClient.java:273)
at sun.net.www.http.HttpClient.New(HttpClient.java:310)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:987)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:923)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:841)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1031)
これはCentOS 4.8でのみ失敗します。同じ単体テスト (組み込みの tomcat を起動し、その中で Web サービスと対話する) は、さまざまな他のシステムで問題なく動作します。このバックトレースの極端な奇妙さに注意してください:HttpHRLConnection
は新しい接続を取得するために呼び出さHttpClient
れ、後のクラスは接続が返される前に独自のソケットを閉じたようです。
さらに、テストには、同じサービスの同じサーバー設定を行い、問題なく会話する友人がいます。
さらに、次の呪文 (少し省略されています) が回避策です。
@Before
public void pingServiceToWorkAroundCentos() {
try {
/* ... code to make a connection to the service and close it ... */
} catch (Throwable t) {
// do nothing
}
}
言い換えれば、各テスト ケースを実行する前に余分な使い捨て接続を手配すると、この問題が何であれ、それが使い果たされてしまいます。
これは何ですか?