Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JAX-WS中禁用SSL套接字连接池?_Java_Sockets_Connection_Jax Ws_Pooling - Fatal编程技术网

Java 在JAX-WS中禁用SSL套接字连接池?

Java 在JAX-WS中禁用SSL套接字连接池?,java,sockets,connection,jax-ws,pooling,Java,Sockets,Connection,Jax Ws,Pooling,我想知道是否可以在JAX-WS中禁用套接字连接池 我正在从Jetty内部呼叫一个Web服务。webservice设计为在任何给定时间最多有两个到服务器的连接。其中一个连接是阻塞连接,用于与服务器进行发布/订阅轮询。另一个连接用于发出标准SOAP请求。一旦连接轮询,就不能使用其他连接进行轮询,或者服务器返回错误 为此,我创建了两个SOAP端口,一个用于轮询,另一个用于发出请求。这非常有效,直到轮询器返回一些数据,并且SOAP请求连接处于空闲状态。当这种情况发生时,下次我尝试使用相同的SOAP端口进

我想知道是否可以在JAX-WS中禁用套接字连接池

我正在从Jetty内部呼叫一个Web服务。webservice设计为在任何给定时间最多有两个到服务器的连接。其中一个连接是阻塞连接,用于与服务器进行发布/订阅轮询。另一个连接用于发出标准SOAP请求。一旦连接轮询,就不能使用其他连接进行轮询,或者服务器返回错误

为此,我创建了两个SOAP端口,一个用于轮询,另一个用于发出请求。这非常有效,直到轮询器返回一些数据,并且SOAP请求连接处于空闲状态。当这种情况发生时,下次我尝试使用相同的SOAP端口进行轮询时,它会从连接池中选择一个连接并重用它。如果碰巧获得SOAP请求连接,服务器将返回一个错误。从那时起,轮询器就死在水中了,因为我创建的任何新SOAP端口最终都会重用这两个连接中的一个,这两个连接都被认为对轮询无效

一个可能的解决方案是禁用连接池,这意味着每次我创建一个新的SOAP端口时,它都会建立一个新的连接。要么是这样,要么是一种接近插座本身的方法,我可以用力关闭插座

还值得一提的是,到服务器的连接是一个相互验证的SSL连接

仅供参考,以下是我尝试连接到的服务器的规范:


任何帮助都将不胜感激!谢谢,Marshall,在尝试了很多不同的方法之后,我发现了一个解决问题的变通方法。不幸的是,我无法想出如何禁用连接池。如果有人知道怎么做,我想听听解决办法

我最终创建了自己的自定义SSL套接字工厂,作为默认SSL套接字工厂的传递,我在HttpsURLConnection类上设置了默认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类传入默认套接字工厂。ManagedSocketFactory的代码如下所示:

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

}

在尝试了很多不同的方法后,我发现了一个解决问题的变通方法。不幸的是,我无法想出如何禁用连接池。如果有人知道怎么做,我想听听解决办法

我最终创建了自己的自定义SSL套接字工厂,作为默认SSL套接字工厂的传递,我在HttpsURLConnection类上设置了默认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类传入默认套接字工厂。ManagedSocketFactory的代码如下所示:

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

}