使用Netty在Java中发送连续数据的最佳方式

时间:2011-07-21 19:11:02

标签: java multithreading network-programming threadpool netty

我打算使用Netty设计TCP服务器。当客户端连接时,我必须立即开始抽水 持续向客户提供XML数据......持续数小时/天。就这么简单。

所以,我覆盖“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();
        }
    }

1 个答案:

答案 0 :(得分:2)

做一段时间/睡眠会起作用,但不会采用Netty超级可扩展的风格。它将是每线程连接编程。

相反,在Executor上安排定期作业,将消息写入通道。