从Netty读取的有效方式

时间:2012-06-01 09:19:06

标签: java netty

我之前曾问过this关于使用netty有效地将消息写入网络的问题。现在,阅读方面的问题更加紧迫。至少在编写消息时,可以控制用作中间存储的字节缓冲区(因此可以编写代码来重用缓冲区),但在Netty的读取端(即上游事件),OioWorker和NioWorker类完全使用无法从网络byte[]插入用于阅读的InputStream。 例如,调用run() OioWorker方法来读取字节。此方法创建一个新的byte []。

我怎么能告诉Netty停止这样做并且可能重用一些ChannelBuffer? (我知道会有线程问题 - 我准备处理那些 - 事实上我在单线程上运行整个读操作)

1 个答案:

答案 0 :(得分:0)

使用java ThreadLocal<T>

  private static final ThreadLocal<ChannelBuffer> headBuffer = new ThreadLocal<ChannelBuffer>() {
    @Override
    protected ChannelBuffer initialValue() {
      return ChannelBuffers.buffer(DEFAULT_HEAD_LENGTH);
    }
  };

  @Override
  public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
    ...
    headBuffer.get().clear();
    headBuffer.get().writeBytes(outboundHeadBuff);
    e.getChannel().write(headBuffer.get());
    ...
  }