-1

最近、クライアント アプリケーションがサーバーに接続するときに SocketTimeoutException が発生しました。クライアント アプリは、Axis1.4 を SOAP エンジンとして利用しました。すでにソケットの接続タイムアウトと読み取りタイムアウトを 20 秒に設定していますが、接続タイムアウト値が機能していないようです。

JDK でのソケット作成について掘り下げた後、使用されるソケット ファクトリはsun.security.ssl.SSLSocketFactoryImplであり、ソケット impl はsun.security.ssl.SSLSocketImplです。問題は SSLSocketImpl の初期化にあります。接続タイムアウト値が 0 にハードコードされています。つまり、タイムアウトがないということです。

SSLSocketImpl(SSLContextImpl context, InetAddress host, int port)
        throws IOException {
    super();
    init(context, false);
    SocketAddress socketAddress = new InetSocketAddress(host, port);
    connect(socketAddress, 0);
}

そして、接続方法は次のとおりです。

 /**
 * Connects this socket to the server with a specified timeout
 * value.
 *
 * This method is either called on an unconnected SSLSocketImpl by the
 * application, or it is called in the constructor of a regular
 * SSLSocketImpl. If we are layering on top on another socket, then
 * this method should not be called, because we assume that the
 * underlying socket is already connected by the time it is passed to
 * us.
 *
 * @param   endpoint the <code>SocketAddress</code>
 * @param   timeout  the timeout value to be used, 0 is no timeout
 * @throws  IOException if an error occurs during the connection
 * @throws  SocketTimeoutException if timeout expires before connecting
 */
public void connect(SocketAddress endpoint, int timeout)
        throws IOException {

    if (self != this) {
        throw new SocketException("Already connected");
    }

    if (!(endpoint instanceof InetSocketAddress)) {
        throw new SocketException(
                              "Cannot handle non-Inet socket addresses.");
    }

    super.connect(endpoint, timeout);
    doneConnect();
}

Sun の実装で 0 がハードコーディングされているのはなぜですか? これはバグですか?このことから、アプリケーションがタイムアウトを処理する必要があることがわかりますが、これは奇妙です。

4

1 に答える 1