在Netty中,是否有人知道ChannelBuffer是否传递给上游事件的处理程序(在从ChannelEvent /或MessageEvent转换之后)是否会在处理时由Netty框架同时写入?
用户指南和示例未明确说明是否会发生这种情况。
例如,想象一下扩展SimpleChannelHandler并绑定为netty服务器上的处理程序的类中的以下方法:
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
{
ChannelBuffer buffer = (ChannelBuffer) e.getMessage();
if (buffer.readableBytes() == 4)
{
// Is it possible for the number of readable bytes to increase here?
}
}
在上面的方法中,是否可以在注释行上增加可读字节数(假设客户端仍在发送数据),或者保证这些帧是单独的消息而不写入提供的缓冲区?
我问的原因是要知道在进行某些处理之前是否应该将缓冲区复制到本地缓冲区,或者这样的复制是否是多余的。
答案 0 :(得分:4)
一旦Netty创建了ChannelBuffer
并用它触发了MessageEvent
,它就不在Netty的手中,因此Netty不会以任何方式对其进行修改。处理程序或其他用户代码可以修改缓冲区,但通常,编写良好的处理程序不会干扰其他处理程序。如果坏处理程序保留对接收缓冲区的引用并稍后修改,那么您将看到破坏的缓冲区状态。