我是Netty的新手,需要以自定义方式处理邮件。我有以下界面:
public interface Command{ }
public interface CommandFactory{
Command(byte b)
}
public interface CommandProcessor{
void process(Command c, Object arg)
}
现在我从客户端收到一些数据并想要处理它。我正在为此实施ReplayingDecoder<Void>
:
public class CommandDecoder extends ReplayingDecoder<Void>{
private CommandFactory cmf;
private CommandProcessor cmp;
void decode(ChannelHandlerContext ctx, ByteBuf in, List<AnyRef> out){
Command command = cmf.command (
in.readByte()
);
String arg = new String (
in.readBytes (
in.readShort()
).array()
);
cmp.process(command, arg); //<------------ Here
}
}
事情是我不确定。我在解码器内处理命令。至少可以说这看起来很奇怪。也许我应该将已解码的commmand
和arg
进一步传递给channel pipeline
。
但是ChannelInboundHandler
选择哪个命令处理?</ p>
答案 0 :(得分:2)
你是对的。最好将解码器和实际业务逻辑分开以进行命令处理。在这种情况下,最好的处理程序将是SimpleChannelInboundHandler
。一般来说,它只接受特定类型的消息。
看起来像这样:
public class MyCommandHandler extends SimpleChannelInboundHandler<Command> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, Command command) throws Exception {
//process here your message
//command.type;
//command.args
}
}
所以你解码了命令之后:
Command command = cmf.command (
in.readByte(),
new String (in.readBytes (in.readShort()).array())
);
您可以将其传递给管道中的下一个MyCommandHandler
:
out.add(command);