[英]Disable SSL socket connection pooling in JAX-WS?
我想知道是否有可能在JAX-WS中禁用套接字连接池?
我正在从Jetty内调用Web服务。 Web服务被设计为在任何给定时间最多与服务器建立两个连接。 连接之一是阻止连接,该连接用于与服务器进行发布/订阅轮询。 另一个连接用于发出标准SOAP请求。 连接轮询后,便无法再使用其他连接轮询,否则服务器将返回错误。
为此,我创建了两个SOAP端口,其中一个用于轮询,另一个用于发出请求。 在轮询器返回一些数据并且SOAP请求连接闲置在那里之前,这非常有用。 发生这种情况时,下一次我尝试使用相同的SOAP端口进行轮询时,它将从连接池中选择一个连接并重新使用它。 如果碰巧获得SOAP请求连接,服务器将返回错误。 从那时起,轮询器就死了,因为我创建的任何新SOAP端口最终都会重用这两个连接之一,这两个连接都被认为对轮询无效。
一个可能的解决方案是禁用连接池,这意味着每次我创建一个新的SOAP端口时,它都会建立一个新的连接。 要么,要么一种获取套接字本身的方法,我可以强行关闭它。
值得一提的是,与服务器的连接是相互认证的SSL连接。
仅供参考,这是我要连接的服务器的规格:
任何帮助,将不胜感激! 谢谢,马歇尔
在尝试了许多不同的方法之后,我发现了解决该问题的方法。 不幸的是,我无法弄清楚如何禁用连接池。 如果有人知道该怎么做,我想听听解决方案。
我最终创建了自己的自定义SSL套接字工厂,该工厂充当对默认SSL套接字工厂的传递,该工厂是在HttpsURLConnection类上设置的:
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.