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

如何在netty中从HTTP服务器请求处理程序正确调用HTTP客户端?,http,events,netty,Http,Events,Netty,我正在用netty 3.3.1开发自定义HTTP服务器 我需要实现这样的东西 HTTP服务器接收请求 HTTP服务器解析它并将HTTP请求作为客户端调用给其他机器 HTTP服务器等待(2)中发送的请求响应 HTTP服务器根据在(3)中接收到的内容发送对来自(1)的请求的响应 这意味着客户端请求(2)的行为必须是同步的 我所写的是基于,但它不起作用,因为我收到 java.lang.IllegalStateException: await*() in I/O thread causes a dea

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

我需要实现这样的东西

  • HTTP服务器接收请求
  • HTTP服务器解析它并将HTTP请求作为客户端调用给其他机器
  • HTTP服务器等待(2)中发送的请求响应
  • HTTP服务器根据在(3)中接收到的内容发送对来自(1)的请求的响应
  • 这意味着客户端请求(2)的行为必须是同步的

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

    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行开始):

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

    因此它变成了异步的,避免了等待*函数。请求被正确调用。但是——我不知道为什么——这条线

                  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();
        }
    });   
    

    嗨,你解决这个问题了吗?我也在这样做。
    channel.getCloseFuture().addListener(new ChannelFutureListener() {
        public void operationComplete(ChannelFuture future) {
            System.err.println("Disconnected"); 
            new Thread(new Runnable() {
                public void run() {
                    bootstrap.releaseExternalResources();
                }
            }).start();
        }
    });