2011-03-30 83 views
2

Nettyをテストしようとしていますが、複数のクライアントを作成してサーバーに接続すると、クライアントの一部が凍結して終了しません。 は、ここに私のコード(基本的に私は彼女https://github.com/brunodecarvalho/netty-tutorialsからコードを使用し、単に複数のクライアントを使用するように変更):でSystem.exitを(-1)を呼び出すNettyが複数のクライアント接続で凍結しました


for (int i = numthr; i > 0; i--) { 
      Runnable runner = new Runnable() { 
       public void run() { 
        final Client client = new Client("localhost", 10400, nummes, 0); 
        if (!client.start()) { 
         System.exit(-1); 
         return; 
        } 
        client.flood(); 
        Runtime.getRuntime().addShutdownHook(new Thread() { 
         @Override 
         public void run() { 
          client.stop(); 
         } 
        }); 
       } 
      }; 
      executor.execute(runner); 
     } 

    public void messageReceived(Envelope message) { 

     if (this.received.incrementAndGet() == this.messages) { 

      System.out.println(nmb.incrementAndGet()); 


     } 
    } 

    public boolean start() { 

     // For production scenarios, use limited sized thread pools 
     this.clientFactory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), 
                   Executors.newCachedThreadPool(),1); 
     this.channelGroup = new DefaultChannelGroup(this + "-channelGroup"); 
     this.handler = new ClientHandler(this, this.channelGroup); 
     ChannelPipelineFactory pipelineFactory = new ChannelPipelineFactory() { 

      @Override 
      public ChannelPipeline getPipeline() throws Exception { 
       ChannelPipeline pipeline = Channels.pipeline(); 
       pipeline.addLast("encoder", new Encoder()); 
       pipeline.addLast("decoder", new Decoder()); 
       pipeline.addLast("handler", handler); 
       return pipeline; 
      } 
     }; 

     ClientBootstrap bootstrap = new ClientBootstrap(this.clientFactory); 
     bootstrap.setOption("reuseAddress", true); 
     bootstrap.setOption("tcpNoDelay", true); 
     bootstrap.setOption("keepAlive", true); 
     bootstrap.setPipelineFactory(pipelineFactory); 


     boolean connected = bootstrap.connect(new InetSocketAddress(host, port)).awaitUninterruptibly().isSuccess(); 
     if (!connected) { 
      this.stop(); 
     } 

     return connected; 
    } 

     this.serverFactory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), 
                   Executors.newCachedThreadPool()); 
     this.channelGroup = new DefaultChannelGroup(this + "-channelGroup"); 
     ExecutionHandler executionHandler = new ExecutionHandler(
       new MemoryAwareThreadPoolExecutor(270, 1048576, 1048576)); 

     ServerBootstrap bootstrap = new ServerBootstrap(this.serverFactory); 
     bootstrap.setPipelineFactory(
       new DatabaseGatewayPipelineFactory(executionHandler)); 
     bootstrap.setOption("reuseAddress", true); 
     bootstrap.setOption("child.tcpNoDelay", true); 
     bootstrap.setOption("child.keepAlive", true); 
     bootstrap.setOption("child.connectTimeoutMillis", 10000); 

     Channel channel = bootstrap.bind(new InetSocketAddress(this.host, this.port)); 
     if (!channel.isBound()) { 
      this.stop(); 
      return false; 
     } 

     this.channelGroup.add(channel); 

答えて

1

コードは同じポート番号で毎回Clientの新しいスレッドを作成しています。複数のスレッドが同じポート上のメッセージを処理しているため、これにより問題が発生する可能性があります。

-1

。 JVMを終了しますが、他のクライアントスレッドは引き続きアクティブです。この動作は必要ですか?

+0

私はそれが問題ではないと言います。この行は、クライアントが起動しなかったときに何らかのエラーが発生した場合にのみ実行されます。そして、それは実行されません – Aldarund

関連する問題