2

JAX-WSでソケット接続プールを無効にすることが可能かどうか疑問に思いましたか?

Jetty内からWebサービスに電話をかけています。Webサービスは、常にサーバーに最大2つの接続を持つように設計されています。接続の1つは、サーバーとのpub/subポーリングを実行するために使用されるブロッキング接続です。もう1つの接続は、標準のSOAP要求を行うために使用されます。接続がポーリングされると、他の接続を使用してポーリングすることはできなくなります。そうしないと、サーバーはエラーを返します。

これを行うために、2つのSOAPポートを作成します。1つはポーリングに使用し、もう1つは要求を行うために使用します。これは、ポーラーがデータを返し、SOAP要求接続がアイドル状態になるまでうまく機能します。その場合、次に同じSOAPポートでポーリングしようとすると、接続プールから接続の1つが選択され、再利用されます。たまたまSOAP要求接続を取得した場合、サーバーはエラーを返します。その時点から、ポーラーは水中で死んでしまいます。私が作成した新しいSOAPポートは、ポーリングに対して無効と見なされている2つの接続のいずれかを再利用することになります。

考えられる解決策は、接続プールを無効にすることです。つまり、新しいSOAPポートを作成するたびに、新しい接続が確立されます。それか、強制的に閉じることができるソケット自体に到達する方法のいずれかです。

サーバーへの接続は相互に認証されたSSL接続であることも言及する価値があるかもしれません。

参考までに、接続しようとしているサーバーの仕様は次のとおりです。

http://www.trustedcomputinggroup.org/files/resource_files/93C23F2A-1A4B-B294-D0A36CCD8A9E7BD3/TNC_IFMAP_v2_0R0_47.pdf

どんな助けでもいただければ幸いです!ありがとう、マーシャル

4

1 に答える 1

0

さまざまなことを試した後、問題の回避策を見つけました。残念ながら、接続プールを無効にする方法を理解できませんでした。誰かがそれを行う方法を知っているなら、私は解決策を聞きたいです。

最終的に、HttpsURLConnectionクラスで設定したデフォルトのSSLソケットファクトリへのパススルーとして機能する独自のカスタムSSLソケットファクトリを作成しました。

SSLContext context = SSLContext.getInstance("TLS");
context.init(new KeyManager[] { new ClientKeyManager() }, 
    new TrustManager[] { new ClientTrustManager() }, 
    new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(new ManagedSSLSocketFactory(context.getSocketFactory()));

SSLContextクラスからデフォルトのソケットファクトリを渡すことに注意してください。ManagedSSLSocketFactoryのコードは次のようになります。

private class ManagedSSLSocketFactory extends SSLSocketFactory
{
    private SSLSocketFactory m_socketFactory;

    public ManagedSSLSocketFactory(SSLSocketFactory socketFactory)
    {
        m_socketFactory = socketFactory;
    }

    @Override
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException
    {
        Socket socket = m_socketFactory.createSocket(s, host, port, autoClose);

        //Note that m_arcThread, m_arcSocket, etc are defined in the containing class
        if(Thread.currentThread() == m_arcThread)
        {
            if(m_arcSocketInvalid || (socket == m_ssrcSocket))
            {
                closeSocketQuietly(socket);
                return createSocket(s, host, port, autoClose);
            }
            m_arcSocketInvalid = false;
        }

        ... omitted some convoluted code that deals with edge cases

        return socket;
    }

    ... rest of implementation

}
于 2012-10-04T18:41:01.693 に答える