繁体   English   中英

如何从 HTTP 服务器请求处理程序 in.netty 正确调用 HTTP 客户端?

[英]How to call properly HTTP client from HTTP server request handler in netty?

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

我需要实现这样的东西

  1. HTTP 服务器收到请求
  2. HTTP 服务器解析它并调用 HTTP 请求作为客户端到其他机器
  3. HTTP 服务器等待(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()命令在我的 herver 处理程序的messageReceived function 中被调用。

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

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

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

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

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

谢谢,

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

channel.getCloseFuture().addListener(new ChannelFutureListener() {
    public void operationComplete(ChannelFuture future) {
        System.err.println("Disconnected"); 
        new Thread(new Runnable() {
            public void run() {
                bootstrap.releaseExternalResources();
            }
        }).start();
    }
});   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM