如何将netty解码器中的消息发送到管道中的下一个处理程序/解码器?

如何将netty解码器中的消息发送到管道中的下一个处理程序/解码器?,netty,pipeline,decoder,Netty,Pipeline,Decoder,我的频道管道包含几个解码器,它们都在TextWebSocketFrame消息上运行。现在我的问题是,我必须根据消息的某些内容选择正确的解码器 本质上,我必须解析消息中的某个字段,然后决定是继续处理消息还是将消息传递给下一个编码器/处理程序 大多数人建议在这种情况下使用一个解码器来解码所有消息,但我的问题是,有些解码器是动态添加的,将所有逻辑放在一个解码器中会很混乱 当前代码如下所示: @Override protected void decode(ChannelHandlerContext ct

我的频道管道包含几个解码器,它们都在TextWebSocketFrame消息上运行。现在我的问题是,我必须根据消息的某些内容选择正确的解码器

本质上,我必须解析消息中的某个字段,然后决定是继续处理消息还是将消息传递给下一个编码器/处理程序

大多数人建议在这种情况下使用一个解码器来解码所有消息,但我的问题是,有些解码器是动态添加的,将所有逻辑放在一个解码器中会很混乱

当前代码如下所示:

@Override
protected void decode(ChannelHandlerContext ctx, TextWebSocketFrame msg, List<Object> out) throws Exception {
    String messageAsJson = msg.text();
    JsonObject jsonObject = JSON_PARSER.fromJson(messageAsJson, JsonObject.class);

    JsonObject messageHeader = jsonObject.getAsJsonObject(MESSAGE_HEADER_FIELD);
    String serviceAsString = messageHeader.get(MESSAGE_SERVICE_FIELD).getAsString();
    String inboundTypeAsString = messageHeader.get(MESSAGE_TYPE_FIELD).getAsString();

    Service service = JSON_PARSER.fromJson(serviceAsString, Service.class);
    InboundType inboundType = JSON_PARSER.fromJson(inboundTypeAsString, InboundType.class);

    if (service == Service.STREAMING) {
        out.add(decodeQuotesMessage(inboundType, messageAsJson));
    } else {

    }
}
@覆盖
受保护的无效解码(ChannelHandlerContext ctx、TextWebSocketFrame消息、列表输出)引发异常{
字符串messageAsJson=msg.text();
JsonObject JsonObject=JSON_PARSER.fromJson(messageAsJson,JsonObject.class);
JsonObject messageHeader=JsonObject.getAsJsonObject(消息头字段);
字符串serviceAsString=messageHeader.get(MESSAGE_SERVICE_字段).getAsString();
String inboundTypeAsString=messageHeader.get(消息类型字段).getAsString();
Service Service=JSON_PARSER.fromJson(serviceAString,Service.class);
InboundType InboundType=JSON_PARSER.fromJson(inboundTypeAsString,InboundType.class);
if(service==service.STREAMING){
add(decodeQuotesMessage(inboundType,messageAsJson));
}否则{
}
}
所以基本上,我需要在else分支中使用一些逻辑来将消息传递给管道中的下一个处理程序


我知道,这种方法不是最有效的方法,但我的服务架构有一条慢路径(在不同的线程池上运行),包括这种逻辑和一条快速路径。因此,我可以接受一些缓慢的代码在这个地方

一般来说,您需要这样的东西:

if (service == Service.STREAMING) {
    ctx.pipeline().addLast(new StreamingHandler());
} else {
    ctx.pipeline().addLast(new OtherHandler());
}
out.add(decodeQuotesMessage(inboundType, messageAsJson));
ctx.pipeline().remove(this);
其背后的逻辑是:

  • 您解码了标题,现在知道了需要遵循的流程
  • 根据标题向管道中添加特定的处理程序
  • 您将解码的消息添加到“out”列表中,因此您说“将此解码消息发送到管道中的下一个处理程序,若当前处理程序是管道中的最后一个处理程序,那个将是在步骤2中定义的处理程序”
  • 您可以从管道中删除当前处理程序,以避免处理程序重复,以防协议会一次又一次地发送相同的头。但是,这是一个特定于您的协议的步骤,可能没有必要

  • 这只是一般的方法,但是,它实际上取决于您的协议流。

    一般来说,您需要这样的方法:

    if (service == Service.STREAMING) {
        ctx.pipeline().addLast(new StreamingHandler());
    } else {
        ctx.pipeline().addLast(new OtherHandler());
    }
    out.add(decodeQuotesMessage(inboundType, messageAsJson));
    ctx.pipeline().remove(this);
    
    其背后的逻辑是:

  • 您解码了标题,现在知道了需要遵循的流程
  • 根据标题向管道中添加特定的处理程序
  • 您将解码的消息添加到“out”列表中,因此您说“将此解码消息发送到管道中的下一个处理程序,若当前处理程序是管道中的最后一个处理程序,那个将是在步骤2中定义的处理程序”
  • 您可以从管道中删除当前处理程序,以避免处理程序重复,以防协议会一次又一次地发送相同的头。但是,这是一个特定于您的协议的步骤,可能没有必要
  • 这只是一般的方法,但是,它实际上取决于您的协议流