Netty: использовать объединенный буфер для записи

#java #netty

#java #netty

Вопрос:

В настоящее время я работаю над POC с использованием Netty, и пока все идет очень хорошо, и мне удалось запустить и запустить довольно много функций.

Однако у меня есть вопрос о повторном использовании байтового буфера для записи. В следующем примере вы можете увидеть созданный вручную ответ bytebuffer, но он создается для каждого запроса, и это не требуется. Я хотел бы использовать ‘buf’. В настоящее время я немного работаю в режиме проб и ошибок, и я проверил примеры. Хотя мой случай выглядит очень стандартным, я не смог найти правильный способ создания объединенного буфера.

   public class OperationHandler extends ChannelInboundHandlerAdapter {
    private ByteBuf buf;

    @Override
    public void handlerAdded(ChannelHandlerContext ctx) {
        buf = ctx.alloc().buffer(1024);
        //    System.out.println("Channel handler added");
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) {
        buf.release();
        buf = null;
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        try {
            ByteBuffer response = ByteBuffer.allocate(1024);
            byte[] operation = (byte[]) msg;
            invoker.invoke(operation, response);
            response.flip();
            ctx.write(Unpooled.wrappedBuffer(response));
        } finally {
            ReferenceCountUtil.release(msg);
        }
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // Close the connection when an exception is raised.
        cause.printStackTrace();
        ctx.close();
    }
}
  

Комментарии:

1. Вы случайно не нашли решение? Я нахожусь в той же ситуации, и вместо того, чтобы использовать объединенные прямые буферы, я рассматриваю возможность просто использовать не объединенный прямой буфер и выделить его один раз.

2. Я отказался от Netty и использую NIO api напрямую. Все байтовые буферы перерабатываются.

3. Мне жаль, что вы не смогли использовать Netty. Однако Netty обеспечивает объединение буферов в своем ядре. Вы видели PooledByteBufAllocator ?