user2686299
user2686299

Reputation: 427

ChannelOutboundHandlerAdapter is not called

My server has few handlers

                            new ConnectionHandler(),
                            new MessageDecoder(),
                            new PacketHandler(),
                            new MessageEncoder()

It seems that last handler should be called when the server sends data to the client, but it never called.

Here is code of the handler

public class MessageEncoder extends ChannelOutboundHandlerAdapter {

    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        System.out.println("from encoder");
        NetCommand command = (NetCommand)msg;
        byte[] data = JsonSerializer.getInstance().Serialize(command);
        ByteBuf encoded = ctx.alloc().buffer(4+data.length);
        encoded.writeInt(data.length).writeBytes(data);
        ctx.writeAndFlush(encoded);
    }   
}

As you see i'm using POJO instead of ByteBuf, but it does not work. And even when I try to send ByteBuf the last handler is not called too.

Also here is how I send the data

@Override
public void run()
{
    Packet packet;
    NetCommand data;
    Session session;

    while ( isActive )
    {
        try {
            session = (Session) this.sessionQueue.take();
            packet = session.getWritePacketQueue().take();
            data =  packet.getData();
            System.out.println("data code: "+data.netCode);
            ChannelHandlerContext ctx = packet.getSender().getContext();
            ctx.writeAndFlush(data);

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

What did I do wrong?

Upvotes: 0

Views: 692

Answers (1)

Norman Maurer
Norman Maurer

Reputation: 23557

Most likely the ChannelHandlerContext you use for writeAndFlush() belongs to a ChannelHandler which is befor your last handler in the pipeline. If you want to ensure that the write starts at the tail / end of the pipeline use ctx.channel().writeAndFlush(...)

Upvotes: 1

Related Questions