Я играю с ChunkedWriteHandler для обработки ChunkedFile и попал в ситуацию ниже
где, если я запишу свой ChunkedFile в канал внутри каналаFuture Listener,
и я получил
оба java.nio.channels.ClosedChannelException и java.lang.NullPointerException
когда я делаю 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!");
}
}
);
}
}
);
Единственный известный мне способ сделать это:
- не использовать слушателя
- и добавление 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!");
}
}
);
Что я сделал не так?
Полный код (также на 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!");
// }
// }
// );
//// 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!");
}
}
);