开发者

jboss netty upload file handler using ChunkedWriteHandler

I'm playing with ChunkedWriteHandler to handle a ChunkedFile and got into a situation below where if I write my ChunkedFile into the channel inside the channelFuture Listener,

and I got both java.nio.channels.ClosedChannelException & java.lang.NullPointerException

when I do clientChannel.write()

 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!");
                                }
                            }
                    );

                }
        }
    );

The only way that I know to make this work is: - not to use the listener - and adding Thread.sleep(1000)

    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!");
                }
            }
    );

What have I done wrong ?

Full Code (also at http://github.com/lydonchandra/netty/blob/master/src/test/java/org/jboss/netty/handler/stream/ChunkedWriteHandlerTest.java)

            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!");
    //                                  }
    //                              }
    //           开发者_JAVA技巧           );
    ////                        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!");
                }
            }
    );


Upgrade to netty 3.2.7.Final. There was a bug in the previous release (I think it was 3.2.5.Final) which threw a NPE.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜