2012-04-04 4 views
1

Ich bin ein Tool zum Testen der Belastung eines Websocket-Servers codieren. Ich brauche eine Menge (Zehntausende) von Client-Verbindungen zum Server.Mehrere ClientBootstrap Ausgabe

Also ich habe eine Client-Klasse. Innerhalb dieser Klasse erstelle ich neue Versionen von:

  1. ChannelPipelineFactory (mit meinem Handler und dem webscoket Client handshaker)
  2. ClientBootstrap

Im run() Methode, die ich den folgenden Code haben:

public void run() { 
    clientBootstrap.setPipelineFactory(clientChannelPipelineFactory); 

    ChannelFuture future = clientBootstrap.connect(
     new InetSocketAddress(
      clientConfiguration.getHost(), 
      clientConfiguration.getPort() 
     ) 
    ); 

    try { 
     future.awaitUninterruptibly().rethrowIfFailed(); 

     WebSocketClientHandshaker handshaker = clientChannelPipelineFactory.getHandshaker(); 

     channel = future.getChannel(); 
     handshaker.handshake(channel).awaitUninterruptibly().rethrowIfFailed(); 
    } catch (Exception e) { 
     log.error("Error in the client channel", e); 
     stop(); 
    } 
} 

Der Kanal, der von ChannelFuture zurückgegeben wird, wird als Feld im Client gespeichert.

Dann mache ich meine Arbeit und versuche, alle geöffneten Kanäle zu schließen. Die stop() Methode:

public void stop() { 
    log.debug(String.format("Close channel for client(%s)", id)); 
    if (channel != null) { 
     if (channel.isWritable()) { 
      log.debug(String.format("Channel for client(%s) is writable", id)); 
      ChannelFuture writeFuture = channel.write(new CloseWebSocketFrame()); 
      writeFuture.addListener(ChannelFutureListener.CLOSE); 
     } 
    } 

    clientBootstrap.releaseExternalResources(); 
} 

Aber wenn der stop() auf irgendeinem Klienten angerufen wird, schließt er alle Kanäle !?

p.s. Code, der alle Kanäle (single threaded) schließt:

for (FSBBridgeServerClient client : clients) { 
     for (FSBBridgeServerClient subClient : clients) { 
      log.debug("c:" + subClient.getChannel()); 
      log.debug("c:" + subClient.getChannel().isOpen()); 
     } 
     client.stop(); 
} 

Einige Debug-Log:

2012-04-04 17:19:29,441 DEBUG [main] ClientApp - c:[id: 0x2344b18f, /127.0.0.1:38366 => localhost/127.0.0.1:5544] 
2012-04-04 17:19:29,441 DEBUG [main] ClientApp - c:true 
2012-04-04 17:19:29,442 DEBUG [main] ClientApp - c:[id: 0x01c20eb7, /127.0.0.1:38367 => localhost/127.0.0.1:5544] 
2012-04-04 17:19:29,442 DEBUG [main] ClientApp - c:true 


2012-04-04 17:19:34,414 DEBUG [main] ClientApp - c:[id: 0x2344b18f, /127.0.0.1:38366 :> localhost/127.0.0.1:5544] 
2012-04-04 17:19:34,414 DEBUG [main] ClientApp - c:false 
2012-04-04 17:19:34,414 DEBUG [main] ClientApp - c:[id: 0x01c20eb7, /127.0.0.1:38367 :> localhost/127.0.0.1:5544] 
2012-04-04 17:19:34,414 DEBUG [main] ClientApp - c:false 

Antwort

1

Ich denke, Ihr Problem clientBootstrap.releaseExternalResources(); ruft.

Nach der documentation ... delegiert diese Methode den Aufruf einfach an ChannelFactory.releaseExternalResources().

+0

Danke, scheint, das war ein Problem. –

Verwandte Themen