【问题标题】:How to send a message inside a netty decoder to the next handler/decoder in the pipeline?如何将 netty 解码器中的消息发送到管道中的下一个处理程序/解码器?
【发布时间】:2018-04-29 05:59:47
【问题描述】:

我的通道管道包含几个解码器,它们都在 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 {

    }
}

所以基本上我需要 else 分支中的一些逻辑来将消息传递给管道中的下一个处理程序。

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

【问题讨论】:

    标签: netty pipeline decoder


    【解决方案1】:

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

    if (service == Service.STREAMING) {
        ctx.pipeline().addLast(new StreamingHandler());
    } else {
        ctx.pipeline().addLast(new OtherHandler());
    }
    out.add(decodeQuotesMessage(inboundType, messageAsJson));
    ctx.pipeline().remove(this);
    

    后面的逻辑是下一个:

    1. 您解码了标头,现在您知道需要遵循什么流程;
    2. 您根据您的标头将特定的处理程序添加到管道;
    3. 您将解码后的消息添加到“输出”列表,因此您说“将此解码后的消息发送到管道中的下一个处理程序,如果当前处理程序是管道中的最后一个处理程序,这将是第 2 步中定义的处理程序”;
    4. 您从管道中删除当前处理程序以避免处理程序重复,以防您的协议一次又一次地发送相同的标头。但是,这是特定于您的协议的步骤,可能不是必需的。

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

    【讨论】:

      猜你喜欢
      • 2017-11-20
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多