質問
Nettyでは、チャンネルバッファが上流イベントのためにハンドラーに渡されたかどうか(ChannelEvent /またはMessageEventからキャストした後)が、処理中にNettyフレームワークによって同時に書かれているかどうかを知っていますか?
ユーザーガイドと例は、これが起こるかどうかを明確に明確にしません。
たとえば、SimpleChannelHandlerを拡張し、ネットサーバーのハンドラーとしてバインドされているクラスで以下の方法を想像してください。
@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?
}
}
上記の方法では、読み取り可能なバイトの数がコメント行で増加する可能性がありますか(クライアントがまだデータを送信していると仮定します)、またはそれらのフレームは個別のメッセージであることが保証され、付属のバッファーに書き込まれませんか?
私が尋ねる理由は、処理の一部を行う前に、バッファーをローカルのものにコピーする必要があるかどうか、またはそのようなコピーが余分なものであるかどうかを知ることです。
解決
Nettyが作成したら ChannelBuffer
そして、トリガーa MessageEvent
それで、それはネットの手から外れているため、Nettyは決してそれを変更しません。ハンドラーまたは他のユーザーコードはバッファを変更できますが、通常、よく書かれたハンドラーは他のハンドラーと干渉しません。悪いハンドラーが受信したバッファーへの参照を保持し、後で変更すると、壊れたバッファ状態が表示されます。
所属していません StackOverflow