2011-07-21 121 views
1

我打算使用Netty来设计TCP服务器。当客户端连接时,我必须立即开始将 XML数据连续输送到客户端...几小时/天。它很简单。使用Netty发送Java连续数据的最佳方法

因此,我重写“channelConnected”方法并发送来自该方法的数据,对吧?......这很好。

我将使用下面的ChannelFactory

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

NioServerSocketChannelFactory文档说

工作线程执行非阻塞读取和非阻塞模式写的一个或多个频道。

好。

根据有效的Java项目51:不要依赖线程调度,我想工作线程做一个“工作单位”,然后完成/返回。所以在我的情况下,虽然我不得不连续发送数据,但我想发送一些块(可以说是1 MB)然后完成(工作单元完成),以便工作线程可以返回。然后我会发送另一个1 MB。

下面的例子来自Netty HERE的官方指南。
我想这个问题是,在这种情况下,如果我必须无条件地保持发送时间给客户端,我会怎么做,考虑 每个发送作为一个工作单元。

这样做的一种方法是只放一个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

做一段时间/睡觉可以工作,但不会在Netty超级可缩放风格。这将是线程每连接编程。

取而代之的是,在Executor上安排一个周期性的作业,将消息写入通道。

相关问题