2

我正在使用 netty 3.3.1 开发自定义 HTTP 服务器。

我需要实现这样的东西

  1. HTTP 服务器接收请求
  2. HTTP 服务器解析它并调用 HTTP 请求作为其他机器的客户端
  3. HTTP Server 等待(2)中发送的请求的响应
  4. HTTP 服务器根据 (3) 中收到的内容发送对 (1) 请求的响应

这意味着客户端请求 (2) 必须表现为同步的。

我写的是基于HttpSnoopClient 示例但它不起作用,因为我收到

java.lang.IllegalStateException: 
await*() in I/O thread causes a dead lock or sudden performance drop. Use addListener() instead or call await*() from a different thread. 

我已经从上面提到的示例中重构了代码,现在它看起来不再像这样了(从 HttpSnoopClient 的第 7f 行开始):

    ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
    future.addListener(new ChannelFutureListener() {
      public void operationComplete(ChannelFuture future) {
        if (!future.isSuccess()) {
          System.err.println("Cannot connect"); 
            future.getCause().printStackTrace();
            bootstrap.releaseExternalResources();
            return;
          }
          System.err.println("Connected");

          Channel channel = future.getChannel();

          // Send the HTTP request.
          channel.write(request);
          channel.close();



          // Wait for the server to close the connection.
          channel.getCloseFuture().addListener(new ChannelFutureListener() {
            public void operationComplete(ChannelFuture future) {
              System.err.println("Disconnected"); 
              bootstrap.releaseExternalResources(); // DOES NOT WORK?
            }
          });   
        }
    });

  } 
}

run()上面示例中的命令在messageReceived我的 herver 处理程序的函数中调用。

所以它变成了异步的并且避免了 await* 函数。请求被正确调用。但是 - 因为我不知道的原因 - 这条线

              bootstrap.releaseExternalResources(); // DOES NOT WORK?

不起作用。它抛出一个异常,说我无法杀死我当前正在使用的线程(这听起来很合理,但仍然没有给我一个答案,如何以不同的方式做到这一点)。

我也不确定这是正确的方法吗?

也许您可以推荐一个netty中此类事件编程技术的教程?通常,如何处理一些必须按指定顺序调用并相互等待的异步请求?

谢谢,

4

1 回答 1

1

如果你真的想在关闭时释放引导程序,你可以这样做:

channel.getCloseFuture().addListener(new ChannelFutureListener() {
    public void operationComplete(ChannelFuture future) {
        System.err.println("Disconnected"); 
        new Thread(new Runnable() {
            public void run() {
                bootstrap.releaseExternalResources();
            }
        }).start();
    }
});   
于 2012-04-08T17:46:54.950 回答