Netty不会同时处理多条消息

时间:2014-11-05 12:55:25

标签: java netty

在您的服务器“nety”测试期间,我遇到了一个令人不快的问题。 我模仿通信非常差的情况,并且两个数据包同时到达。

服务器必须按如下方式处理数据包:

 income binary packet
    |
  transcription packet into my POJO Message class object (objects if few messages in one packet found)
    |
  filtering unexpected messages
    |
  do Logic on every message

但是当在一个收入数据包中找到两条消息时,只会处理第一条消息。

将收入字节转录为消息类型

的解码器
 public class InboundDecryptor extends ByteToMessageDecoder { 
  @Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
    //      identified =false;
    ArrayList<Message> results = new ArrayList<>();
    byte[] byteinput = new byte[in.readableBytes()];
    in.readBytes(byteinput);
    Message lastIncome = ctx.channel().attr(Server.getLastIncomeKey()).get();
    LOG.debug("RawIncome: " + Message.bytesToHex(byteinput) + "\nlength: " + byteinput.length);
    ArrayList<byte[]> packets = PacketGet.getBytePackets(byteinput);

    if (packets != null & !packets.isEmpty()) {  //send packets to decryption
        for (byte[] packet : packets) {
            byte[] decrypted;
            decrypted = ctx.channel().attr(Server.cypherattrkey).get().decrypt(packet);
            LOG.debug(("bytesIn:" + Message.bytesToHex(decrypted)));
            Message message = PacketGet.toMessage(decrypted);
            if (message != null) {
                LOG.debug(message.toString());
                if (checkNumber(message, ctx, out)) {

                    out.add((Object) message); //send packets to further managing
                } else {
                    skipDC = true;
                }
            }
        }
    }
    if (out.isEmpty() && !skipDC) {
        skipDC = false;
        LOG.debug("Nothing was parsed");
        ctx.close();
    }

}

接下来是过滤器处理消息并丢掉意外的消息。

 public class ResponseHandler extends MessageToMessageCodec<Message, Message> {

 @Override
protected void decode(ChannelHandlerContext ctx, Message msg, List<Object> out) throws Exception {
//throw away unexpected messages
//put correct messages into out
  }
}

最后执行逻辑的处理程序

public class HandlePackets extends SimpleChannelInboundHandler {

@Override
public void channelRead0(ChannelHandlerContext ctx, Object message) throws Exception {
//doing logic
}

为什么,当几条消息同时出现时,只处理一个消息? 也许是因为两个解码器一个接一个地停留?

UPD
我为消息处理编写了loggin,现在我可以说,第二条消息不会进入第二个解码器。

0 个答案:

没有答案