单个服务器上的netty多个查询

时间:2012-04-16 15:27:34

标签: netty

我正在尝试使用netty同时从服务器下载多个地图图块图像。但到目前为止,我总是有各种错误: - 超时 - 冻结 - org.jboss.netty.handler.codec.PrematureChannelClosureException

每10次正常工作一次......我尝试了几种不同的方法,但都没有正常工作。

我有人可以解决它(我认为是基本的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() );
            }
        }

1 个答案:

答案 0 :(得分:0)

这是netty 3.4.0.Final中的一个错误..我刚刚提交修复,我们将尽快发布3.4.1.Final。

相关问题