使用ChunkedWriteHandler的jboss netty上载文件处理程序

使用ChunkedWriteHandler的jboss netty上载文件处理程序,netty,Netty,我正在使用ChunkedWriteHandler来处理ChunkedFile,遇到了下面的情况 如果我将ChunkedFile写入channelFuture Listener中的频道 我得到了 java.nio.channels.ClosedChannelException和java.lang.NullPointerException 当我执行clientChannel.write()时 我所知道的实现这一目标的唯一方法是: -不要使用侦听器 -和添加线程。睡眠(1000) 我做错了什么 完整代

我正在使用ChunkedWriteHandler来处理ChunkedFile,遇到了下面的情况 如果我将ChunkedFile写入channelFuture Listener中的频道

我得到了 java.nio.channels.ClosedChannelException和java.lang.NullPointerException

当我执行clientChannel.write()时

我所知道的实现这一目标的唯一方法是: -不要使用侦听器 -和添加线程。睡眠(1000)

我做错了什么

完整代码(也可在上)


升级至netty 3.2.7.Final。上一个版本(我想是3.2.5.Final)中有一个bug抛出了一个NPE

 InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", testPort);
 final ChannelFuture channelFuture =  clientBootstrap.connect(inetSocketAddress);

 channelFuture.addListener(
            new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception {
                    System.out.println("connected!");

                    Channel clientChannel = channelFuture.getChannel();
                    ChannelFuture channelFuture2 = clientChannel.write( new ChunkedFile( new File("c:\\openjdk-7-fcs-src-b147-27_jun_2011.zip"))  );

                    channelFuture2.addListener(
                            new ChannelFutureListener() {
                                @Override
                                public void operationComplete(ChannelFuture future) throws Exception {
                                    System.out.println("finished uploading!");
                                }
                            }
                    );

                }
        }
    );
    InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", testPort);
    final ChannelFuture channelFuture =  clientBootstrap.connect(inetSocketAddress);

    Thread.sleep(1000);

    Channel clientChannel = channelFuture.getChannel();
    ChannelFuture channelFuture2 = clientChannel.write( new ChunkedFile( new File("k:\\soft\\openjdk-7-fcs-src-b147-27_jun_2011.zip"))  );

    channelFuture2.addListener(
            new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception {
                    System.out.println("finished uploading!");
                }
            }
    );
            NioClientSocketChannelFactory channelFactory = new NioClientSocketChannelFactory(clientExecutor, Executors.newCachedThreadPool());
    ClientBootstrap clientBootstrap = new ClientBootstrap(channelFactory);
    clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() {

        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    new SimpleChannelUpstreamHandler() {

                        @Override
                          public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
                                // Send the first message.  Server will not send anything here
                                // because the firstMessage's capacity is 0.
                                System.out.println("client - channel connected");
                          }

                        @Override
                        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
                            System.out.println("message received");
                        }

                        @Override
                              public void exceptionCaught(
                                      ChannelHandlerContext ctx, ExceptionEvent e) {
                                    // Close the connection when an exception is raised.
                                    System.out.println(e.getCause());
                                    e.getChannel().close();
                              }
                    },

                    new ChunkedWriteHandler()
            );
        }

    });

    InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", testPort);
    final ChannelFuture channelFuture =  clientBootstrap.connect(inetSocketAddress);

    //      channelFuture.addListener(
    //              new ChannelFutureListener() {
    //                  @Override
    //                  public void operationComplete(ChannelFuture future) throws Exception {
    //                      System.out.println("connected!");
    //                      
    //                      Channel clientChannel = channelFuture.getChannel();
    //                      ChannelFuture channelFuture2 = clientChannel.write( new ChunkedFile( new File("k:\\soft\\openjdk-7-fcs-src-b147-27_jun_2011.zip"))  );
    //                      
    //                      channelFuture2.addListener(
    //                              new ChannelFutureListener() {
    //                                  @Override
    //                                  public void operationComplete(ChannelFuture future) throws Exception {
    //                                      System.out.println("finished uploading!");
    //                                  }
    //                              }
    //                      );
    ////                        Thread.sleep(20000);
    ////                        clientChannel.getCloseFuture().await(100000);
    //                      
    //                  }
    //          }
    //      );

    // why do I need this sleep ??? for some reason, I can't just use channelFutureListener.operationComplete.
    // something else is killing the channel if i wrap things up inside channelFutureListener.operationComplete
    Thread.sleep(1000);

    Channel clientChannel = channelFuture.getChannel();
    ChannelFuture channelFuture2 = clientChannel.write( new ChunkedFile( new File("k:\\soft\\openjdk-7-fcs-src-b147-27_jun_2011.zip"))  );

    channelFuture2.addListener(
            new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception {
                    System.out.println("finished uploading!");
                }
            }
    );