netty を使用して、サーバーから同時に複数のマップ タイル イメージをダウンロードしようとしています。しかし、これまでのところ、常にさまざまなエラーがあります: - タイムアウト - フリーズ - org.jboss.netty.handler.codec.PrematureChannelClosureException
10回に1回は正常に動作します...いくつかの異なるアプローチを試しましたが、正しく動作するものはありません。
私は誰かがそれを解決することができます(私は基本的なnioクライアントの問題と考えています)、私は感謝しています:
package bench;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import org.apache.derby.iapi.services.io.ArrayOutputStream;
import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.*;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
import org.jboss.netty.handler.codec.http.*;
public class NettyDebug {
public static void main(String[] args) {
String host = "tile.openstreetmap.org";
int port = 80;
final List<String> requests = new ArrayList<String>();
requests.add("/5/16/8.png");
requests.add("/5/18/12.png");
requests.add("/5/18/13.png");
requests.add("/5/14/10.png");
requests.add("/5/20/11.png");
requests.add("/5/19/13.png");
requests.add("/5/22/11.png");
requests.add("/5/16/13.png");
requests.add("/5/20/14.png");
requests.add("/5/21/14.png");
requests.add("/5/19/12.png");
requests.add("/5/21/11.png");
requests.add("/5/15/10.png");
requests.add("/5/15/15.png");
requests.add("/5/22/14.png");
requests.add("/5/14/15.png");
requests.add("/5/17/8.png");
requests.add("/5/18/8.png");
requests.add("/5/13/9.png");
requests.add("/5/22/12.png");
requests.add("/5/13/16.png");
requests.add("/5/22/13.png");
requests.add("/5/17/13.png");
requests.add("/5/17/12.png");
requests.add("/5/16/14.png");
requests.add("/5/19/8.png");
requests.add("/5/20/8.png");
requests.add("/5/14/9.png");
requests.add("/5/23/14.png");
requests.add("/5/14/16.png");
requests.add("/5/16/12.png");
requests.add("/5/23/11.png");
requests.add("/5/16/11.png");
requests.add("/5/13/15.png");
requests.add("/5/17/11.png");
requests.add("/5/13/10.png");
requests.add("/5/19/14.png");
requests.add("/5/20/13.png");
requests.add("/5/19/11.png");
requests.add("/5/18/11.png");
requests.add("/5/18/14.png");
requests.add("/5/17/14.png");
requests.add("/5/15/9.png");
requests.add("/5/23/13.png");
requests.add("/5/21/13.png");
requests.add("/5/20/12.png");
requests.add("/5/15/16.png");
requests.add("/5/21/8.png");
requests.add("/5/23/12.png");
requests.add("/5/22/8.png");
requests.add("/5/18/16.png");
requests.add("/5/19/9.png");
requests.add("/5/20/10.png");
requests.add("/5/15/14.png");
requests.add("/5/19/10.png");
requests.add("/5/21/12.png");
requests.add("/5/16/9.png");
requests.add("/5/23/8.png");
requests.add("/5/23/15.png");
requests.add("/5/23/10.png");
requests.add("/5/16/16.png");
requests.add("/5/13/13.png");
requests.add("/5/13/12.png");
requests.add("/5/22/10.png");
requests.add("/5/14/14.png");
requests.add("/5/17/16.png");
requests.add("/5/17/9.png");
requests.add("/5/20/9.png");
requests.add("/5/21/16.png");
requests.add("/5/21/10.png");
requests.add("/5/18/10.png");
requests.add("/5/15/12.png");
requests.add("/5/21/15.png");
requests.add("/5/23/16.png");
requests.add("/5/21/9.png");
requests.add("/5/15/11.png");
requests.add("/5/13/8.png");
requests.add("/5/19/16.png");
requests.add("/5/19/15.png");
requests.add("/5/14/11.png");
requests.add("/5/14/8.png");
requests.add("/5/20/16.png");
requests.add("/5/18/15.png");
requests.add("/5/15/13.png");
requests.add("/5/20/15.png");
requests.add("/5/18/9.png");
requests.add("/5/22/15.png");
final ClientBootstrap BOOTSTRAP = new ClientBootstrap(
new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
BOOTSTRAP.setPipelineFactory(new PipeFactory());
final Map<Integer, ArrayOutputStream> results = new ConcurrentHashMap<Integer, ArrayOutputStream>();
for(final String query : requests){
final ChannelFuture cf = BOOTSTRAP.connect(new InetSocketAddress(host, port));
cf.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
final Channel channel = future.getChannel();
results.put(channel.getId(), new ArrayOutputStream());
final HttpRequest request = new DefaultHttpRequest(
HttpVersion.HTTP_1_1, HttpMethod.GET, query);
request.setHeader(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.CLOSE);
request.setHeader(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.BYTES);
if (channel.isOpen() && channel.isWritable()) {
channel.write(request);
}
}
});
}
//HOW TO HANDLE THOSE MULTIPLE QUERIES ?
}
private static class PipeFactory implements ChannelPipelineFactory {
@Override
public ChannelPipeline getPipeline() throws Exception {
// Create a default pipeline implementation.
final ChannelPipeline pipeline = org.jboss.netty.channel.Channels.pipeline();
pipeline.addLast("codec", new HttpClientCodec());
pipeline.addLast("handler", new QueryHandler());
return pipeline;
}
}
private static class QueryHandler extends SimpleChannelUpstreamHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
System.out.println( e.getMessage().getClass() );
}
}