mina使用スレッドプール例およびsocket同時テスト
4744 ワード
ExecutorService executor = Executors.newFixedThreadPool(1000);
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.setHandler( new TimeServerHandler() );
acceptor.getSessionConfig().setReadBufferSize( 2048 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
acceptor.getFilterChain().addLast("executor",
new ExecutorFilter(executor));
acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
acceptor.bind( new InetSocketAddress(PORT) );
クライアントはとても簡単で、1000個の同時接続を模擬します: public static void main( String[] args ) throws Throwable
{
for(int i=0;i<1000;i++){
log.info("Enter run l..."+i);
new Thread(new ClientThread(i)).start();
}
}
各クライアントコードは:public void run() {
// TODO Auto-generated method stub
log.info("#### thread :"+this.num+" Running...");
NioSocketConnector connector = new NioSocketConnector();
// Configure the service.
connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);
connector.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
connector.getFilterChain().addLast( "logger", new LoggingFilter() );
connector.setHandler(new ClientSessionHandler(" hihi new!"));
IoSession session;
for (;;) {
try {
ConnectFuture future = connector.connect(new InetSocketAddress(
HOSTNAME, PORT));
future.awaitUninterruptibly();
session = future.getSession();
break;
} catch (Exception e) {
System.err.println("Failed to connect.");
e.printStackTrace();
}
}
// wait until the summation is done
session.getCloseFuture().awaitUninterruptibly();
connector.dispose();
log.info("#### thread :"+this.num+" over ...");
}
このように書くのはすでにNIOの特性と数量が1000の接続プールを使ったかどうか分かりません.そしてクライアントがminaのAPIを使わずにSocket APIで直接接続すれば、サーバは1000個未満、200個以上でConnection refusedになることに気づいた.问题补充先ほど试してみましたが、1000のクライアント接続をシミュレートして931に成功しました.异常は:2008-12-28 02:18:06,968 ERROR (LoggingFilter.java:127) - EXCEPTION :
java.io.IOException: 。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233)
at sun.nio.ch.IOUtil.read(IOUtil.java:206)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:207)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:180)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:42)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:568)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:547)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:539)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:57)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:867)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:65)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
どのパラメータを调整してこのエラーが発生しないことができますか?つまり何を調整しても1000個の接続に問題がつながってWindowsを補充するにはOSの設定を変更する必要がありますが、設定しても機能しません.もう一度やってみましょう.JAvaのNIOの目的は、サーバー側にできるだけ少ないSocket接続を開いて、できるだけ多くのクライアントリクエストを処理できるようにすること(主に非ブロックキューが機能しているのか、それともそのconcurrentスレッドプールが機能しているのか、前者であるべきか分からない)という理解で間違いないでしょう.A
mina 1.1.xバージョンはセッションのようです.close(); 対応するメソッド定義は、CloseFuture close()です.mina 2.0はもっと簡単で使いやすいです.しかし、私たちは直接使うわけではありません.2.0を参考に少し削減しました.minaの性能は心配することはありません.成功例は:openfireはgoogleでいいです:openfire connection manager