次のメッセージを処理しようとしています。
CMD (string) FLAG (byte) CMD_OPT (string)
文字列は、長さを含む先頭の 1 バイトで表され、その後に最大 255 バイトが続きます。したがって、特定の例については:
EQ_REGISTER 0 flaux
19 バイトあります。私のパイプラインでは、LengthFieldBasedFrameDecoder から開始し、最初の文字列の値を確認したら、最初のデコーダーを削除しようとします。問題は、デコーダーが FLAG バイトで再度呼び出され、ロジックがオフになっていることです。
ここに私のパイプラインがあります:
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("commandDecoder", new CerbStringDecoder());
pipeline.addLast("commandHandler", new EventQueueCmdServerHandler());
CerbStringDecoder は次のとおりです。
class CerbStringDecoder extends LengthFieldBasedFrameDecoder {
public CerbStringDecoder() {
super(255, 0, 1, 0, 1);
}
protected Object decode(
ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
ChannelBuffer buf = (ChannelBuffer) super.decode(ctx, channel, buffer);
if (buf == null)
return null;
return buf.toString(Charset.forName("UTF-8"));
}
}
public class EventQueueCmdServerHandler extends SimpleChannelHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
String command = (String) e.getMessage();
if (EQ_REGISTER.equals(command)) {
System.out.println("COMMAND: [" + command + "]");
ctx.getPipeline().addLast("handler", new EventQueueRegisterHandler());
ctx.getPipeline().remove("commandDecoder");
....
EventQueueRegisterHandler は、FLAG や CMD_OPT などを取得することを想定しています。
私が間違っていること、またはこれがNettyのバグ/制限であるかどうかについて何かアドバイスはありますか?
ありがとう