我正在使用 servlet(版本 7)测试用 Java EE 编写的 Web 应用程序。我正在向我的 servlet 发送大量 HTTP 请求,我想知道所有请求何时完成。
为了发送请求,我使用了执行器。我也不知道这是否是最有效的方法。
for (int i=0; i < numRequests; i++) {
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<util.Response> responseFromServlet = null;
responseFromServlet = executor.submit(new util.Request(new URL(url)));
if ( i != numRequests -1 ) {
executor.shutdown();
} else {
responseFromServlet.get().getBody(); // suspensive call for last invocation
executor.shutdown();
}
}
实际上,执行器等待最后调用的 HTTP 请求结束,但通常不是最后一个完成。
我认为创建一个新线程等待每个 HTTP servlet 的响应是疯狂的。我无法生成 100-200-300 个线程,每个请求一个!
那么有没有办法了解所有的servlets何时结束执行呢?如果需要,我可以修改我的 servlet。
===编辑===
更准确地说,这是 Request 类的实现:
public class Request implements Callable<Response> {
private URL url;
public Request(URL url) {
this.url = url;
}
@Override
public Response call() throws Exception {
return new Response(url.openStream());
}
}
这是 Response 类:
public class Response {
private InputStream body;
public Response(InputStream body) {
this.body = body;
}
public InputStream getBody() {
return body;
}
}
最佳答案
使用执行器很好,您可能希望增加线程池的大小,但有更多并发线程执行您的请求。
使用 CoutnDownLatch用等待所有线程完成的 numRequests
初始化。
util.Request
必须在其 run
方法中调用 latch.countDown()
代码看起来像这样(手写 - 未测试)
ExecutorService executor = Executors.newFixedThreadPool(n);
final CountDownLatch latch = new CountDownLatch(numRequests);
for (int i=0; i < numRequests; i++) {
executor.submit(new util.Request(new URL(url), latch));
}
latch.await(someValue, TimeUnit.SECONDS)
` 编辑
重新实现 util.Request
做类似的事情
public class Request implements Callable<Response> {
final private URL url;
final private CountDownLatch latch;
public Request(URL url, CountDownLatch latch) {
this.url = url;
this.latch = latch;
}
@Override
public Response call() throws Exception {
try {
return new Response(url.openStream());
}
catch (Exception e) {
//do something useful
}
finally {
latch.countDown();
}
}
}
您可能希望在倒计时闩锁之前使用您的响应流,以验证您是否从服务器获得了您期望的响应。
关于java - 如何使用 Java 监视来自/到 servlet 的 HTTP 请求和响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15546389/