2011-07-21 6 views
1

私は、Nettyを使用してTCPサーバーを設計する予定です。クライアントが接続すると、私はただちに XMLデータをクライアントに数時間/日連続でポンピングする必要があります。それは簡単です。Nettyを使用してJavaで連続データを送信する最良の方法

だから、私は "channelConnected"メソッドをオーバーライドし、そのメソッドからデータを送信するのですか?... thats great。私は、次のChannelFactory

を使用することになります

ChannelFactory factory = 
    new NioServerSocketChannelFactory(
      Executors.newCachedThreadPool(), 
      Executors.newCachedThreadPool()); 

NioServerSocketChannelFactoryドキュメントは

ワーカースレッドが読んで、非ブロックモードでは1つまたは複数のチャネルのために書くの非ブロッキングを行うと言います。

良い。

有効なJavaの項目51:スレッドスケジューラに依存しないで、ワーカースレッドに「作業単位」を実行して終了/戻りたいとします。

私の場合、データを連続して送信する必要がありますが、チャンクを送信して(作業単位が完了した)、作業スレッドが戻ることができるようにします。それから私は別の1 MBを送るでしょう。

以下の例は、Netty HEREの公式ガイドからのものです。
私は無条件でクライアントに時間を送っていなければならない場合、このシナリオでは、 をそれぞれ作業単位として送信すると考えています。

これを行う方法の1つは、whileループを入れてThread.Sleepを行うことです。その他の方法で?

package org.jboss.netty.example.time; 

    public class TimeServerHandler extends SimpleChannelHandler { 

     @Override 
     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { 
      Channel ch = e.getChannel(); 

      ChannelBuffer time = ChannelBuffers.buffer(4); 
      time.writeInt(System.currentTimeMillis()/1000); 

      ChannelFuture f = ch.write(time); 

      f.addListener(new ChannelFutureListener() { 
       public void operationComplete(ChannelFuture future) { 
        Channel ch = future.getChannel(); 
        ch.close(); 
       } 
      }); 
     } 

     @Override 
     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { 
      e.getCause().printStackTrace(); 
      e.getChannel().close(); 
     } 
    } 

答えて

2

while/sleepを実行すると動作しますが、Nettyの超スケーラブルスタイルにはなりません。これは、スレッドごとの接続プログラミングです。

代わりに、メッセージをチャネルに書き込むExecutorで定期的なジョブをスケジュールします。

関連する問題