我们目前在自定义负载测试框架中使用Apache Httpclient。我必须实现对WebSocket测试的支持,并且由于HttpClient不支持WebSockets,我正在寻找替代方案。所以,我一直在玩OkHttp和Async Http Client。一般来说,我可以同时使用它们作为替代品,但任何一个都给我一些我需要解决的挑战。这是我与OkHttp面对的那些人:
com.squareup.okhttp.internal.Internal
中使用全局静态,这对我来说似乎有些可怕。在我们的框架中,我们启动了许多线程,这些线程又执行我们称之为请求流的线程。每个线程都会获得自己的HttpClient实例。看来,使用OkHttp,您不能在一个VM中拥有多个独立的OkHttpClient实例,因为它们会因静态内容而干扰。我似乎能够通过使用一个OkHttpClient实例和一个委托给线程范围的CookieHandler的CookieHandler来解决这个问题。我可能不得不对ConnectionPools做同样的事情。我在这里走在正确的轨道上吗?更新/解决方案:
在杰西发表评论后再次挖掘代码,我意识到Internal
单身人士没有保持状态。我想我只是因为我在代码库中找到了一个单身,即使它没有造成任何伤害,我也很恼火。
我可以使用Jesse建议的自定义套接字工厂设置本地地址:
public class LocalAddressSocketFactory extends SocketFactory {
private static final String ERROR_MSG = "On unconnected sockets are supported";
private final SocketFactory delegate;
private final Provider<InetAddress> localAddressProvider;
public LocalAddressSocketFactory(final SocketFactory delegate,
final Provider<InetAddress> localAddressProvider) {
this.delegate = delegate;
this.localAddressProvider = localAddressProvider;
}
@Override
public Socket createSocket() throws IOException {
Socket socket = delegate.createSocket();
socket.bind(new InetSocketAddress(localAddressProvider.get(), 0));
return socket;
}
@Override
public Socket createSocket(final String remoteAddress, final int remotePort)
throws IOException, UnknownHostException {
throw new UnsupportedOperationException(ERROR_MSG);
}
@Override
public Socket createSocket(final InetAddress remoteAddress, final int remotePort)
throws IOException {
throw new UnsupportedOperationException(ERROR_MSG);
}
@Override
public Socket createSocket(final String remoteAddress, final int remotePort,
final InetAddress localAddress, final int localPort)
throws IOException, UnknownHostException {
throw new UnsupportedOperationException(ERROR_MSG);
}
@Override
public Socket createSocket(final InetAddress remoteAddress, final int remotePort,
final InetAddress localAddress, final int localPort)
throws IOException {
throw new UnsupportedOperationException(ERROR_MSG);
}
}
这个类依赖于OkHttp只创建未连接套接字的事实。如果可以记录下来,我会很感激。 OkHttpClient允许设置自定义SocketFactory,但您必须自己查明它是如何使用的。我刚刚提交了一个增强Javadocs的拉取请求:https://github.com/square/okhttp/pull/1626。