2017-06-13 9 views
2

私はNettyを初めて使い、カスタム方法でメッセージを処理する必要があります。私は以下のインターフェースを持っています: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 
    } 
} 

私はそれについてはわかりません。私はデコーダ内でコマンドを処理します。最小限に言えば奇妙に見えます。多分、私は復号化されたcommmandargをさらにchannel pipelineに渡すべきでしょう。

しかし、ChannelInboundHandlerはコマンド処理を選択できますか?

答えて

2

あなたは正しいです。コマンド処理のためにデコーダと実際のビジネスロジックを分割する方がよいでしょう。その場合、最高のHandlerは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); 
関連する問題