Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在HttpDecompressor之前添加GlobalTrafficShapingHandler_Java_Reactor Netty - Fatal编程技术网

Java 如何在HttpDecompressor之前添加GlobalTrafficShapingHandler

Java 如何在HttpDecompressor之前添加GlobalTrafficShapingHandler,java,reactor-netty,Java,Reactor Netty,我想在HttpDecompressor之前计算压缩大小 我尝试调用connection.addHandlerFirst,但不起作用 HttpClient.create() .mapConnect((连接,引导)->connection.map( 康涅狄格州->{ conn.addHandlerFirst(新ChannelInboundHandlerAdapter(){ @凌驾 public void channelRead(ChannelHandlerContext ctx,Object msg

我想在HttpDecompressor之前计算压缩大小

我尝试调用
connection.addHandlerFirst
,但不起作用

HttpClient.create()
.mapConnect((连接,引导)->connection.map(
康涅狄格州->{
conn.addHandlerFirst(新ChannelInboundHandlerAdapter(){
@凌驾
public void channelRead(ChannelHandlerContext ctx,Object msg)引发异常{
if(HttpContent的消息实例){
System.out.println(“接收:+msg”);
}
超级通道读取(ctx、msg);
}
});
返回连接;
}
))
.压缩(真);
使用
连接#addHandlerFirst
不会有帮助,因为处理程序将添加到反应器编解码器之后

您可以将此处理程序直接添加到Netty管道,如下所示:

HttpClient.create()
        .mapConnect((connection, bootstrap) -> connection.map(
                conn -> {
                    conn.channel().pipeline().addBefore(NettyPipeline.HttpDecompressor, "myhandler",new ChannelInboundHandlerAdapter() {
                        @Override
                        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                            if (msg instanceof HttpContent) {
                                System.out.println("received:" + msg);
                            }
                            super.channelRead(ctx, msg);
                        }
                    });
                    return conn;
                }
        ))
    .compress(true);
HttpClient.create()
        .doOnResponse((res, conn) ->
                    conn.channel().pipeline().addBefore(NettyPipeline.HttpDecompressor, "myhandler",new ChannelInboundHandlerAdapter() {
                        @Override
                        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                            if (msg instanceof HttpContent) {
                                System.out.println("received:" + msg);
                            }
                            super.channelRead(ctx, msg);
                        }
                    }))
        .doAfterResponse((res, conn) ->
                    conn.channel().pipeline().remove("myhandler"))
        .compress(true)
但是,您应该记住,一旦您将其直接添加到管道中,如果您使用连接池,该处理程序也将保留在下一个请求中(与
连接#addHandlerFirst
不同)。因此,如果您只需要在特定请求中使用它,那么您应该在收到响应后将其删除。 大概是这样的:

HttpClient.create()
        .mapConnect((connection, bootstrap) -> connection.map(
                conn -> {
                    conn.channel().pipeline().addBefore(NettyPipeline.HttpDecompressor, "myhandler",new ChannelInboundHandlerAdapter() {
                        @Override
                        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                            if (msg instanceof HttpContent) {
                                System.out.println("received:" + msg);
                            }
                            super.channelRead(ctx, msg);
                        }
                    });
                    return conn;
                }
        ))
    .compress(true);
HttpClient.create()
        .doOnResponse((res, conn) ->
                    conn.channel().pipeline().addBefore(NettyPipeline.HttpDecompressor, "myhandler",new ChannelInboundHandlerAdapter() {
                        @Override
                        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                            if (msg instanceof HttpContent) {
                                System.out.println("received:" + msg);
                            }
                            super.channelRead(ctx, msg);
                        }
                    }))
        .doAfterResponse((res, conn) ->
                    conn.channel().pipeline().remove("myhandler"))
        .compress(true)