基于解码消息设置netty响应编码

基于解码消息设置netty响应编码,netty,Netty,我正在编写一个netty TCP服务器,它必须根据请求中的responseType值对响应进行编码,例如返回Protobuf或JSON。建议的实施方法是什么 我们的服务器有一个带有解码器、编码器和处理程序的管道 pipeline.addLast(new RequestDecoder<Request>()) pipeline.addLast(new ResponseEncoder<Response>()) pipeline.addLast(new Handler<R

我正在编写一个netty TCP服务器,它必须根据请求中的
responseType
值对响应进行编码,例如返回Protobuf或JSON。建议的实施方法是什么


我们的服务器有一个带有解码器、编码器和处理程序的管道

pipeline.addLast(new RequestDecoder<Request>())
pipeline.addLast(new ResponseEncoder<Response>())
pipeline.addLast(new Handler<Request, Response>())
pipeline.addLast(新的RequestDecoder())
pipeline.addLast(新的ResponseEncoder())
pipeline.addLast(新处理程序())
我考虑使用解码器将正确的编码器添加到管道中,如下所示

pipeline.addLast(new RequestDecoder<Request>())
pipeline.addLast(new ResponseEncoder<Response>())
pipeline.addLast(new Handler<Request, Response>())

class RequestDecoder<Request> {
  public void decode(...) {
    if (request.responseType().equals("protobuf")) {
      ch.pipeline().replace(ResponseEncoder.class, "protobuf", new ProtobufResponseEncoder<Response>());
    } else {
      ch.pipeline().replace(ResponseEncoder.class, "protobuf", new JsonResponseEncoder<Response>());
    }
  }
}
pipeline.addLast(新的RequestDecoder())
pipeline.addLast(新的ResponseEncoder())
pipeline.addLast(新处理程序())
类请求解码器{
公共无效解码(…){
if(request.responseType().equals(“protobuf”)){
替换(responseeCoder.class,“protobuf”,新的ProtobufResponseEncoder());
}否则{
替换(ResponseEncoder.class,“protobuf”,新的JsonResponseEncoder());
}
}
}
这似乎有效,但是否正确?ChannelHandler文档将我引向这个设计

ChannelHandler可以随时添加或删除,因为ChannelPipeline是线程安全的。例如,您可以在即将交换敏感信息时插入加密处理程序,并在交换后将其删除

通道可能是线程安全的,但通道是否可以串行处理请求?如果不是,如果它在完成第一个请求之前启动第二个请求,那么第一个请求的响应会使用第二个请求设置的编码器吗


或者,我可以使用协议对象
RequestDecoder
包装请求,但是如何将未包装的
请求
转发给
处理程序

通道可能是线程安全的,但通道是否可以串行处理请求

Netty不理解通道上固有的请求/响应概念,除非您添加一个理解您的协议的处理程序。在您的情况下,它是您添加的编码器/解码器。 Netty将从通道读取数据,并按可用顺序在管道上发送数据。除此之外的排序由处理程序完成,例如:处理程序可以决定异步处理这些消息,然后无序地写入它们

如果不是,如果它在完成第一个请求之前启动第二个请求,那么第一个请求的响应会使用第二个请求设置的编码器吗

是,如果请求/响应是交错的,则不应修改管道(假设它们已排序)

在您的情况下,我建议将这两个处理程序都放在管道中,让它们有条件地处理消息,否则就通过管道传递消息。或者,您可以使用单个处理程序根据类型对消息进行编码