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.
精彩评论