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

时间:2012-04-08 13:17:43

标签: http events netty

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

我需要实现类似这样的东西

  1. HTTP Server收到请求
  2. HTTP Server解析它并将HTTP请求作为客户端调用到其他计算机
  3. HTTP Server等待(2)
  4. 中发送的请求的响应
  5. HTTP Server根据(3)
  6. 中收到的内容向(1)发送请求的响应

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

    我写的内容基于HttpSnoopClient example,但它不起作用,因为我收到了

    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. 
    

    我从上面提到的例子中重构了the code,现在看起来更像是这样(从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?
                }
              });   
            }
        });
    
      } 
    }
    

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

    因此它变得异步并避免等待*函数。请求被正确调用。但是 - 因为我知道的原因 - 行

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

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

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

    也许你可以在netty中推荐这样的事件编程技巧的教程?如何处理 - 一般情况下 - 与一些必须以指定顺序调用并等待彼此的异步请求?

    谢谢,

1 个答案:

答案 0 :(得分: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();
    }
});