我正在使用ning async http客户端来实现非阻塞性的优点.做一个苹果对苹果测试(非阻塞与阻塞),我发现非阻塞版本正在提供更多的请求样本,但异步http客户端正在创建比其阻塞对应物更多的线程.这是预期还是我遗失的东西?
以下是压力测试的数字
Async Http Client
jMeter - 2 threads, 120 seconds, 1 sec ramp up
Peak threads : 270
Heap usage: 600mb
Peak cpu usage: 30%
Total samples: 18228
Blocking version
jMeter - 2 threads, 120 seconds, 1 sec ramp up
Peak threads: 118
heap usage: 260mb
cpu usage: 18%
total samples: 1472
Run Code Online (Sandbox Code Playgroud)
我正在创建一个连接线程池(重用它们)
AsyncHttpClientConfig.Builder builder = new AsyncHttpClientConfig.Builder();
builder.setRequestTimeoutInMs(2000);
builder.setMaximumConnectionsPerHost(10);
builder.setMaximumConnectionsTotal(100);
client = new AsyncHttpClient(builder.build());
Run Code Online (Sandbox Code Playgroud)
这里有什么我想念的吗?我试着查看线程转储以查看创建线程的内容,但没有找到任何有用的东西.我敢打赌,生成的每个http连接都有一个线程,用于在异步http客户端的I/O完成时触发回调.
我正在AsyncHttpClient从命令行程序使用 ning。我需要等待所有请求结束,以便我可以安全地调用close()客户端。挑战在于我从该计划的许多不同部分提出了许多请求。onCompleted下面剥离了自己的代码,显示了我从另一个请求执行嵌套 HTTP 请求的场景:
final AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
Future<Response> f1 = asyncHttpClient.prepareGet(url).execute(
new AsyncCompletionHandler<Response>() {
public Response onCompleted(Response response)
throws Exception {
//Make more HTTP calls
Future f2 = asyncHttpClient.prepareGet(url).execute(...);
return response;
}
});
Run Code Online (Sandbox Code Playgroud)
这只是示例代码。真实的代码更加复杂并且有更多的 HTTP 调用。close()在我呼叫客户之前确保所有呼叫都已完成的最佳方法是什么?
我在此页面上看到如何做https
http://sonatype.github.com/async-http-client/ssl.html
但是,如果我只是想忽略并接受任何证书,因为在这种环境中,我现在不在乎中间的人,因为它处于隔离的环境中,而我正在做一些工作以对QA数据进行自动化测试,该怎么办?
也许我的问题是如何伪造Java的SSL堆栈中的SSL,以便它在另一端接受任何证书(这不是双向的,因为它是https)。
上面链接中客户端的通用代码是
char[] keyStorePassword = "changeit".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
//ks.load(keyStoreStream, keyStorePassword);
char[] certificatePassword = "changeit".toCharArray();
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, certificatePassword);
KeyManager[] keyManagers = kmf.getKeyManagers();
javax.net.ssl.TrustManager tm = new MyTrustMgr();
javax.net.ssl.TrustManager[] trustManagers = new javax.net.ssl.TrustManager[]{tm };
SecureRandom secureRandom = new SecureRandom();
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(keyManagers, trustManagers, secureRandom);
return ctx;
Run Code Online (Sandbox Code Playgroud)
好吧,解决这个问题,我发现由于某些原因仍然无法解决问题
X509TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] xcs,
String string) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] xcs,
String string) throws CertificateException { …Run Code Online (Sandbox Code Playgroud)