2016-09-01 11 views
2

Netty 4.1.0.Finalを使用していますが、メッセージがアウトバウンドハンドラを通過しないという問題に直面しています。私は1つのインバウンドと1つのアウトバウンドハンドラがあるサンプルプログラムを投稿しています。インバウンドハンドラは、ChannelHandlerContextでwriteAndFlushを使用します。これは、パイプラインで使用可能な最初の使用可能な送信ハンドラにメッセージを転送することです。メモリー管理は単純化のために無視されます。Nettyアウトバウンドハンドラが呼び出されない

ブートストラップコード

EventLoopGroup bossGroup = new NioEventLoopGroup(); 
EventLoopGroup workerGroup = new NioEventLoopGroup(); 
ServerBootstrap bootstrap = new ServerBootstrap(); 
bootstrap.group(bossGroup, workerGroup) 
      .channel(NioServerSocketChannel.class) 
      .localAddress(12021) 
      .childHandler(new ChannelInitializer<SocketChannel>() { 
       @Override 
       protected void initChannel(SocketChannel ch) throws Exception { 
        ch.pipeline().addLast(new TestHandler1(), new TestOutHandler1()); 
       } 
      }); 
ChannelFuture future = bootstrap.bind().sync(); 
System.out.println("Server Started..."); 
    future.channel().closeFuture().sync(); 
    bossGroup.shutdownGracefully(); 
    workerGroup.shutdownGracefully(); 
    System.out.println("Server Shutdown"); 

インバウンド・ハンドラコード

public class TestHandler1 extends ChannelInboundHandlerAdapter { 


private static Log logger = LogFactory.getLog(TestHandler1.class); 

@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 
    logger.info("channelRead"); 
    ctx.writeAndFlush(msg); 
} 

}

送信ハンドラコード

public class TestOutHandler1 extends ChannelOutboundHandlerAdapter { 

private static Log logger = LogFactory.getLog(TestOutHandler1.class); 

@Override 
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { 
    logger.info("write"); 
    ctx.writeAndFlush(msg); 
} 

}

出力

INFO TestHandler1:channelRead

私が代わりにChannelHandlerContextのチャネル上writeAndFlush()を実行して以下のように私のインバウンドハンドラを変更した場合は、私が

が変更された期待される出力を取得しています着信Hanndler

public class TestHandler1 extends ChannelInboundHandlerAdapter { 

private static Log logger = LogFactory.getLog(TestHandler1.class); 

@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 
    logger.info("channelRead"); 
    ctx.channel().writeAndFlush(msg); 
} 

}

出力

INFO TestHandler1:channelRead

INFO TestOutHandler1は:下のリンクでノーマンの説明を1として

を書き、私がすべき(...)ChannelHandlerContext.writeとして理解します私の場合は唯一のアウトバウンドハンドラであるChannelOutboundHandlersを前に置いています。

Norman's Explanation

私の理解が間違っているか、私は何をしないのですなら、私に教えてください。

答えて

3

そのあなたがChannelPipeline.ChannelHandlerContext.writeAndFlush(...)ChannelInboundHandlerChannelOutboundHandlerを追加するためには、ChannelHandlerが追加されChannelPipelineのポイントで起動します。したがって、期待通りに動作するには、ChannelOutboundHandlerを追加してください。

0

ソースコードによれば、ハンドラのタイプが何であっても(インバウンドまたはアウトバウンド)、各ハンドラは1つのパイプラインでチェーンされています。ハンドラが対応するChannelHandlerContextのwriteメソッドを呼び出すと、下記のソースコードを参照してくださいOutboundHandler type.Justのちょうど前の最も近いハンドラに渡される:

private AbstractChannelHandlerContext findContextOutbound() { 
     AbstractChannelHandlerContext ctx = this; 
     do { 
      ctx = ctx.prev; 
     } while (!ctx.outbound); 
     return ctx; 
    } 

メッセージのみだけで自身の前にOutboundHandlerに送信されます。したがって、OutboundHandlerにメッセージを渡す場合は、まずOutboundHandlerを追加し、OutboundHandlerがInboundHandlerの前に追加されていることを確認してから、OutboundHandlerがメッセージを取得するようにしてください。

関連する問題