java - 如何使用 Java 监视来自/到 servlet 的 HTTP 请求和响应

标签 java multithreading jakarta-ee servlets executor

我正在使用 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/

相关文章:

android - java.lang.IllegalStateException : Calling View methods on another thread than the UI thread 错误

jakarta-ee - 在哪里可以找到 com.ibm.websphere.asynchbeans.Work 的相关 .jar 文件?

java - Application.xml 与 sun-application.xml

Java:太高的值(value)处理 - 最佳实践?

java - ModelMapper:使用带有自定义映射的 TypeMap 时,如何使转换器在映射器级别注册

java - 在没有 Apache 的情况下从 301 重定向获取 URL

ruby-on-rails - 如果 Puma 是多线程而不是多进程,为什么要创建多个 PID?

Java 按字符串查找和比较成员(也许是 JPA 功能?)

c - 处理两个线程,一个休眠,一个等待输入

maven-2 - 是否有一个 Maven 插件可以在 J2EE 应用程序中打包实体 bean?