0

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() );
            }
        }
4

1 に答える 1

0

これは netty 3.4.0.Final のバグでした。修正をコミットしたばかりで、3.4.1.Final をできるだけ早くリリースします。

于 2012-04-17T07:31:48.073 に答える