2012-04-04 48 views
1

我正在編寫一個websocket服務器負載測試工具。我需要創建很多(成千上萬個)到服務器的客戶端連接。Multiple ClientBootstrap問題

所以我有一些客戶端類。這個類中創建的新版本:

  1. ChannelPipelineFactory(我的處理程序和webscoket客戶handshaker)
  2. ClientBootstrap

在我有以下代碼的run()方法:

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

ChannelFuture返回的頻道保存爲客戶端中的字段。

然後我做我的工作,並試圖關閉所有打開的渠道。該stop()方法:

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

但是,當停止()被調用的任何客戶端將關閉所有的通道!?

p.s.即關閉所有通道(單線程) 代碼:

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

某些調試日誌:

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 

回答

1

我認爲你的問題是調用clientBootstrap.releaseExternalResources();

根據documentation ...此方法只是將調用委託給ChannelFactory.releaseExternalResources()。

+0

謝謝,似乎是一個問題。 – 2012-04-05 07:29:36