You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by 李向锋 <li...@infosec.com.cn> on 2007/09/18 04:00:12 UTC

Mina Performance

Hello, I Write a Server Demo use Mina-1.1.2,use the
ObjectSerializationCodecFactory. But When Run This Server,Use a 100 threads
Client to test it��s performance,it��s performance is poor. Server machine
is  2CPU *2.8G,1G memory ,Suse Linux  9. It Tran/sec only 60~80. I past the
code under, who can help me?

 

Then,I Run the HttpServer exsample  from Mina1.1.2 in same machine, I use
the apche ab test it.When I use apace ab in 50 concurrency,it performance
Trans/Sec is 4800,but when I use 100 or more concurrency,it performance is
very poor, only 100~200 trans/sec. I cannot understand it ,who can tell me
why?

 

-------------------------------------------Server:--------------------------
-----------------------

 

Main.java

 

/*

 *  Licensed to the Apache Software Foundation (ASF) under one

 *  or more contributor license agreements.  See the NOTICE file

 *  distributed with this work for additional information

 *  regarding copyright ownership.  The ASF licenses this file

 *  to you under the Apache License, Version 2.0 (the

 *  "License"); you may not use this file except in compliance

 *  with the License.  You may obtain a copy of the License at

 *  

 *    http://www.apache.org/licenses/LICENSE-2.0

 *  

 *  Unless required by applicable law or agreed to in writing,

 *  software distributed under the License is distributed on an

 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

 *  KIND, either express or implied.  See the License for the

 *  specific language governing permissions and limitations

 *  under the License. 

 *  

 */

package test.mina.server;

 

import java.net.InetSocketAddress;

import java.util.concurrent.Executors;

 

import org.apache.mina.common.DefaultIoFilterChainBuilder;

import org.apache.mina.common.IoAcceptor;

import org.apache.mina.filter.LoggingFilter;

import org.apache.mina.filter.codec.ProtocolCodecFilter;

import
org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;

import org.apache.mina.filter.executor.ExecutorFilter;

import org.apache.mina.transport.socket.nio.SocketAcceptor;

import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;

 

/**

 * (<b>Entry point</b>) Echo server

 * 

 * @author The Apache Directory Project (mina-dev@directory.apache.org)

 * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (�?, 13  7�?
2007) $

 */

public class Main {

    /** Choose your favorite port number. */

    private static final int PORT = 8282;

 

    /** Set this to true if you want to make the server SSL */

    private static final boolean USE_SSL = false;

 

    public static void main(String[] args) throws Exception {

//        IoAcceptor acceptor = new SocketAcceptor();

        //IoAcceptorConfig config = new SocketAcceptorConfig();

        IoAcceptor acceptor = new SocketAcceptor(4,
Executors.newCachedThreadPool());

        SocketAcceptorConfig config = new SocketAcceptorConfig();

        

//        config.setReuseAddress(true);

        config.setBacklog(30);

        

//        Storager.create();

//        config.getFilterChain().addLast(

//                "protocolFilter",

//                new ProtocolCodecFilter(

//                             new TestProtocolCodecFactory(false)));

 

      config.getFilterChain().addLast(

      "protocolFilter",

      new ProtocolCodecFilter(

              new ObjectSerializationCodecFactory()));

        

        

        

        DefaultIoFilterChainBuilder chain = config.getFilterChain();

 

        chain.addLast("threadPool", new
ExecutorFilter(Executors.newCachedThreadPool()) );

 

//        addLogger(chain);

 

        // Bind

        acceptor.bind(new InetSocketAddress(PORT), new
EchoProtocolHandler(),

                config);

 

        System.out.println("Listening on port " + PORT);

    }

 

 

 

    private static void addLogger(DefaultIoFilterChainBuilder chain)

            throws Exception {

        chain.addLast("logger", new LoggingFilter());

        System.out.println("Logging ON");

    }

}

 

Handler:

 

/*

 *  Licensed to the Apache Software Foundation (ASF) under one

 *  or more contributor license agreements.  See the NOTICE file

 *  distributed with this work for additional information

 *  regarding copyright ownership.  The ASF licenses this file

 *  to you under the Apache License, Version 2.0 (the

 *  "License"); you may not use this file except in compliance

 *  with the License.  You may obtain a copy of the License at

 *  

 *    http://www.apache.org/licenses/LICENSE-2.0

 *  

 *  Unless required by applicable law or agreed to in writing,

 *  software distributed under the License is distributed on an

 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

 *  KIND, either express or implied.  See the License for the

 *  specific language governing permissions and limitations

 *  under the License. 

 *  

 */

package test.mina.server;

 

import java.util.Properties;

 

import org.apache.mina.common.ByteBuffer;

import org.apache.mina.common.IdleStatus;

import org.apache.mina.common.IoHandler;

import org.apache.mina.common.IoHandlerAdapter;

import org.apache.mina.common.IoSession;

import org.apache.mina.common.TransportType;

 

import org.apache.mina.transport.socket.nio.SocketSessionConfig;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

import test.mina.TestRequest;

import test.mina.TestResponse;

 

public class EchoProtocolHandler extends IoHandlerAdapter {

    private static final Logger log = LoggerFactory

            .getLogger(EchoProtocolHandler.class);

 

    public void sessionCreated(IoSession session) {

        if (session.getTransportType() == TransportType.SOCKET) {

           SocketSessionConfig config = (SocketSessionConfig)
session.getConfig(); 

           

             config.setReceiveBufferSize(2048);

             config.setSoLinger(0);

        }

 

        session.setIdleTime(IdleStatus.BOTH_IDLE, 10);

 

    }

 

    public void sessionIdle(IoSession session, IdleStatus status) {

        log.info("*** IDLE #" + session.getIdleCount(IdleStatus.BOTH_IDLE)

                + " ***");

    }

 

    public void exceptionCaught(IoSession session, Throwable cause) {

//        cause.printStackTrace();

        session.close();

    }

 

    public void messageReceived(IoSession session, Object message)

            throws Exception {

    

 

    TestRequest req = (TestRequest)message;

    Processor p = new TESTProcessor();

       

        TestResponse res = new TestResponse(0,"OK");// p.process( req );

        session.write(res);

        

        session.close();

        

    }

}

 

TestRequest:

package test.mina;

 

 

import java.io.Serializable;

import java.util.Enumeration;

import java.util.Properties;

 

public class TestRequest implements Serializable {

         

         private String type;

         private Properties data;

         

         /**

          * @param type

          */

         public TestRequest(String type) {

                   this.type = type;

         }

 

         /**

          * @param type

          * @param data

          */

         public TestRequest(String type, Properties data) {

                   this.type = type;

                   this.data = data;

         }

 

         public Properties getData() {

                   return data;

         }

 

         public void setData(Properties data) {

                   this.data = data;

         }

 

         public String getType() {

                   return type;

         }

         

         public void setKeyValue(String key,String value){

                   if(data == null)

                            data = new Properties();

                   data.setProperty( key,value  );

         }

         

         public String getKeyValue(String key){

                   if(data==null)return null;

                   return data.getProperty(key);

                   

         }

 

         @Override

         public String toString() {

                   StringBuffer buff= new StringBuffer();

                   buff.append( "{[TestRequest]" );

                   buff.append("[request type:" + type + "]");

                   buff.append("[request data:");

                   if( data!=null ){

                            buff.append( data );

                   }

                   buff.append("]");

 

                   buff.append("}");

                   return buff.toString();

                   

                   

                   

         }

         

         

         

 

}

 

TestResponse:

 

package test.mina;

 

import java.io.Serializable;

import java.util.Properties;

 

public class TestResponse implements Serializable {

         

         private int err=0;

         private String msg = "OK";

         

         private Properties data;

 

         public TestResponse(int err, String msg, Properties data) {

                   this.err = err;

                   this.msg = msg;

                   this.data = data;

         }

         

         

         public TestResponse(int err, String msg){

                   this(err,msg,null);

         }

 

 

         public Properties getData() {

                   return data;

         }

 

 

         public void setData(Properties data) {

                   this.data = data;

         }

 

 

         public int getErr() {

                   return err;

         }

 

 

         public String getMsg() {

                   return msg;

         }

         

 

         

         public String toString() {

                   StringBuffer buff= new StringBuffer();

                   buff.append( "{[TestResponse]" );

                   buff.append("[response err:" + err + "]");

                   buff.append("[response msg:" + msg + "]");

                   buff.append("[response data:");

                   if( data!=null ){

                            buff.append( data );

                   }

                   buff.append("]");

                   

 

                   buff.append("}");

                   return buff.toString();

                   

                   

                   

         }        

 

}

 

--------------------------------Client:-----------------------------------

TestSign:

 

package test.thread;

 

import java.io.ByteArrayInputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.PrintWriter;

import java.security.KeyStore;

import java.security.PrivateKey;

import java.security.Security;

import java.util.Enumeration;

 

//import cn.com.infosec.jce.provider.InfosecProvider;

 

/*

 * Created on 2005-10-18

 *

 * TODO To change the template for this generated file go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

 

/**

 * @author lixiangfeng

 *

 * TODO To change the template for this generated type comment go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

public class TestSign {

 

         

         private static int finiCount = 0;

         private static int failCount = 0;

         public static Object synObj = new Object();

         public static Object synObj2 = new Object();

         public static Object synObj3 = new Object();

         public static int threadCount = 0;

         public static void main(String[] args) {

                   

                   try {

                            int uCount = Integer.parseInt(args[0]);

                            int uTime = Integer.parseInt(args[1]);

 

 

                            FileOutputStream fos = new FileOutputStream(
"sign.log" );

                            PrintWriter pr = new PrintWriter( fos );

                            

                            TestSignThread.init();

                            

                            

                            for (int i = 0; i < uCount; i++) {

                                     Thread th = new Thread(new
TestSignThread( uTime, pr ));

                                     th.start();

                            }

                            

                            threadCount = uCount;

                            System.out.println("testcount:" + threadCount);

                            System.out.println( "run time       :" + uTime +
"s" );

                            System.out.println("test running,please
wait...");

                            while( threadCount>0){

                                     Thread.sleep( 1000 );

                            }

                            

                            System.out.println( "test finish......" );

                            System.out.println( "finish count   :" +
finiCount );

                            System.out.println( "failed count   :" +
failCount );

                            System.out.println( "speed:" + (finiCount/uTime)
);

                            

                            

                            

                   } catch (Exception e) {

                            e.printStackTrace();

                   }

         }

         

         

         public static void incSucc(){

                   synchronized(synObj){

                            finiCount++;

                   }

         }

         

         public static void incFail(){

                   synchronized(synObj2){

                            failCount++;

                   }

         }        

         

         public static void stopThread(){

                   synchronized(synObj3){

                            threadCount--;

                   }

         }

         

         

}

 

 

TestThread:

 

package test.thread;

 

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.FileInputStream;

import java.io.ObjectOutputStream;

import java.io.PrintWriter;

import java.net.InetSocketAddress;

import java.net.Socket;

import java.security.PrivateKey;

import java.security.Security;

import java.security.Signature;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Properties;

import java.util.TimeZone;

 

import org.apache.mina.common.ConnectFuture;

import org.apache.mina.common.IoSession;

import org.apache.mina.common.RuntimeIOException;

import org.apache.mina.filter.codec.ProtocolCodecFilter;

import
org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;

import org.apache.mina.transport.socket.nio.SocketConnector;

import org.apache.mina.transport.socket.nio.SocketConnectorConfig;

 

import test.mina.TestRequest;

import test.mina.client.ClientSessionHandler;

 

//import Test.TestResult;

//

//import cn.com.infosec.jce.provider.InfosecProvider;

//import cn.com.infosec.netcert.crypto.CryptoHandler;

//import cn.com.infosec.netcert.rads.CertManager;

//import cn.com.infosec.netcert.rads.SysProperty;

//import cn.com.infosec.netcert.rads.exception.CAException;

//import cn.com.infosec.netcert.rads.exception.RAException;

//import cn.com.infosec.netcert.resource.PropertiesKeysRes;

 

/*

 * Created on 2005-10-18

 *

 * TODO To change the template for this generated file go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

 

/**

 * @author lixiangfeng

 *

 * TODO To change the template for this generated type comment go to

 * Window - Preferences - Java - Code Style - Code Templates

 */

public class TestSignThread implements Runnable {

 

 

         public long endTime = System.currentTimeMillis();

         //public PrivateKey prik = null;

         public PrintWriter pr = null;

         public TestSignThread( int time, PrintWriter pr ){

                   endTime += time * 1000;

                   //this.prik = prik;

                   this.pr = pr;

         }

         

         private static String basedn = "o=infosec";

         private static String template = "EE_SIGNING";

         

         

         public static void init() throws Exception{

                   

 

         }

         

         public void run() {

         

        SocketConnectorConfig cfg = new SocketConnectorConfig();

        cfg.setConnectTimeout(30);

        cfg.getSessionConfig().setSoLinger(0);

 

            cfg.getFilterChain().addLast(

                    "codec",

                    new ProtocolCodecFilter(

                            new ObjectSerializationCodecFactory()));


                   

                   while( true ){

                            if(endTime < System.currentTimeMillis() ){

                                     TestSign.stopThread();

                                     break;

                            }

                            

                            

 

                                    SocketConnector connector = new
SocketConnector();

                                    connector.setWorkerTimeout(1);

 

                                    IoSession session=null;

                                        try {

                                            ConnectFuture future =
connector.connect(new InetSocketAddress(

                                                    "192.168.0.111", 8282),
new ClientSessionHandler(), cfg);

 

                                            future.join();

                                            session = future.getSession();

                                            session.getCloseFuture().join();

                                            TestSign.incSucc();

                                            //break;

                                        } catch (Exception e) {

                                            e.printStackTrace( pr );

                                            TestSign.incFail();

                                        }

 

 

                            

         

                   }

 

         }

 

}

 

ClientHandler:

 

/*

 *  Licensed to the Apache Software Foundation (ASF) under one

 *  or more contributor license agreements.  See the NOTICE file

 *  distributed with this work for additional information

 *  regarding copyright ownership.  The ASF licenses this file

 *  to you under the Apache License, Version 2.0 (the

 *  "License"); you may not use this file except in compliance

 *  with the License.  You may obtain a copy of the License at

 *  

 *    http://www.apache.org/licenses/LICENSE-2.0

 *  

 *  Unless required by applicable law or agreed to in writing,

 *  software distributed under the License is distributed on an

 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

 *  KIND, either express or implied.  See the License for the

 *  specific language governing permissions and limitations

 *  under the License. 

 *  

 */

package test.mina.client;

 

import java.util.Properties;

 

import org.apache.mina.common.IoHandler;

import org.apache.mina.common.IoHandlerAdapter;

import org.apache.mina.common.IoSession;

import org.apache.mina.transport.socket.nio.SocketSessionConfig;

 

import test.mina.TestRequest;

import test.mina.TestResponse;

 

/**

 * {@link IoHandler} for SumUp client.

 * 

 * @author The Apache Directory Project (mina-dev@directory.apache.org)

 * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (�?, 13  7�?
2007) $

 */

public class ClientSessionHandler extends IoHandlerAdapter {

    //private final int[] values;

 

    private boolean finished;

 

 

    public boolean isFinished() {

        return finished;

    }

 

    public void sessionOpened(IoSession session) {

      

//             System.out.println( "Thread" + Thread.currentThread() +  "
start at:" + System.currentTimeMillis()   );

//             SocketSessionConfig config = session.getConfig();

//             config.

    //System.out.println( session.getConfig()   );

    SocketSessionConfig config = (SocketSessionConfig)session.getConfig();

    config.setSoLinger(0);

    TestRequest req = new TestRequest("TESTMINA");

    Properties p1 = new Properties();

    p1.setProperty("CARDSN","1111000000000068993");

    req.setData(p1);

    session.write(req);

    

    

    }

 

    public void messageReceived(IoSession session, Object message) {

        // server only sends ResultMessage. otherwise, we will have to
identify

        // its type using instanceof operator.

        TestResponse res = (TestResponse)message;

//        System.out.println( res );

    

        session.close();

    finished = true;

//             System.out.println( "Thread" + Thread.currentThread() +  "
finish at:" + System.currentTimeMillis()   );

 

    }

 

    public void exceptionCaught(IoSession session, Throwable cause) {

        session.close();

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


答复: 答复: Mina Performance

Posted by 李向锋 <li...@infosec.com.cn>.
I have post it at:

http://www.nabble.com/mina-performance-tf4471354s16868.html

thanks!

-----�ʼ�ԭ��-----
������: Trustin Lee [mailto:trustin@gmail.com] 
����ʱ��: 2007��9��18�� 11:56
�ռ���: dev@mina.apache.org
����: Re: ��: Mina Performance

Please try to post an attachment here:

http://www.nabble.com/Apache-MINA-Support-Forum-f16869.html

Please let me know if it doesn't work.

Trustin

On 9/18/07, ����� <li...@infosec.com.cn> wrote:
>
> Sorry, the mail server reject my mail with attatchment ,please help check
> this code,thanks.
>
> -----�ʼ�ԭ��-----
> ������: Trustin Lee [mailto:trustin@gmail.com]
> ����ʱ��: 2007��9��18�� 10:06
> �ռ���: dev@mina.apache.org
> ����: Re: Mina Performance
>
> Hi,
>
> Could you zip the source code files and attach to our support forum?
>
> Thanks,
> Trustin
>
> On 9/18/07, ����� <li...@infosec.com.cn> wrote:
> > Hello, I Write a Server Demo use Mina-1.1.2,use the
> > ObjectSerializationCodecFactory. But When Run This Server,Use a 100
> threads
> > Client to test it's performance,it's performance is poor. Server machine
> > is  2CPU *2.8G,1G memory ,Suse Linux  9. It Tran/sec only 60~80. I past
> the
> > code under, who can help me?
> >
> >
> >
> > Then,I Run the HttpServer exsample  from Mina1.1.2 in same machine, I
use
> > the apche ab test it.When I use apace ab in 50 concurrency,it
performance
> > Trans/Sec is 4800,but when I use 100 or more concurrency,it performance
is
> > very poor, only 100~200 trans/sec. I cannot understand it ,who can tell
me
> > why?
> >
> >
> >
> >
>
-------------------------------------------Server:--------------------------
> > -----------------------
> >
> >
> >
> > Main.java
> >
> >
> >
> > /*
> >
> >  *  Licensed to the Apache Software Foundation (ASF) under one
> >
> >  *  or more contributor license agreements.  See the NOTICE file
> >
> >  *  distributed with this work for additional information
> >
> >  *  regarding copyright ownership.  The ASF licenses this file
> >
> >  *  to you under the Apache License, Version 2.0 (the
> >
> >  *  "License"); you may not use this file except in compliance
> >
> >  *  with the License.  You may obtain a copy of the License at
> >
> >  *
> >
> >  *    http://www.apache.org/licenses/LICENSE-2.0
> >
> >  *
> >
> >  *  Unless required by applicable law or agreed to in writing,
> >
> >  *  software distributed under the License is distributed on an
> >
> >  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >
> >  *  KIND, either express or implied.  See the License for the
> >
> >  *  specific language governing permissions and limitations
> >
> >  *  under the License.
> >
> >  *
> >
> >  */
> >
> > package test.mina.server;
> >
> >
> >
> > import java.net.InetSocketAddress;
> >
> > import java.util.concurrent.Executors;
> >
> >
> >
> > import org.apache.mina.common.DefaultIoFilterChainBuilder;
> >
> > import org.apache.mina.common.IoAcceptor;
> >
> > import org.apache.mina.filter.LoggingFilter;
> >
> > import org.apache.mina.filter.codec.ProtocolCodecFilter;
> >
> > import
> >
>
org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
> >
> > import org.apache.mina.filter.executor.ExecutorFilter;
> >
> > import org.apache.mina.transport.socket.nio.SocketAcceptor;
> >
> > import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
> >
> >
> >
> > /**
> >
> >  * (<b>Entry point</b>) Echo server
> >
> >  *
> >
> >  * @author The Apache Directory Project (mina-dev@directory.apache.org)
> >
> >  * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (�?, 13  7
> �?
> > 2007) $
> >
> >  */
> >
> > public class Main {
> >
> >     /** Choose your favorite port number. */
> >
> >     private static final int PORT = 8282;
> >
> >
> >
> >     /** Set this to true if you want to make the server SSL */
> >
> >     private static final boolean USE_SSL = false;
> >
> >
> >
> >     public static void main(String[] args) throws Exception {
> >
> > //        IoAcceptor acceptor = new SocketAcceptor();
> >
> >         //IoAcceptorConfig config = new SocketAcceptorConfig();
> >
> >         IoAcceptor acceptor = new SocketAcceptor(4,
> > Executors.newCachedThreadPool());
> >
> >         SocketAcceptorConfig config = new SocketAcceptorConfig();
> >
> >
> >
> > //        config.setReuseAddress(true);
> >
> >         config.setBacklog(30);
> >
> >
> >
> > //        Storager.create();
> >
> > //        config.getFilterChain().addLast(
> >
> > //                "protocolFilter",
> >
> > //                new ProtocolCodecFilter(
> >
> > //                             new TestProtocolCodecFactory(false)));
> >
> >
> >
> >       config.getFilterChain().addLast(
> >
> >       "protocolFilter",
> >
> >       new ProtocolCodecFilter(
> >
> >               new ObjectSerializationCodecFactory()));
> >
> >
> >
> >
> >
> >
> >
> >         DefaultIoFilterChainBuilder chain = config.getFilterChain();
> >
> >
> >
> >         chain.addLast("threadPool", new
> > ExecutorFilter(Executors.newCachedThreadPool()) );
> >
> >
> >
> > //        addLogger(chain);
> >
> >
> >
> >         // Bind
> >
> >         acceptor.bind(new InetSocketAddress(PORT), new
> > EchoProtocolHandler(),
> >
> >                 config);
> >
> >
> >
> >         System.out.println("Listening on port " + PORT);
> >
> >     }
> >
> >
> >
> >
> >
> >
> >
> >     private static void addLogger(DefaultIoFilterChainBuilder chain)
> >
> >             throws Exception {
> >
> >         chain.addLast("logger", new LoggingFilter());
> >
> >         System.out.println("Logging ON");
> >
> >     }
> >
> > }
> >
> >
> >
> > Handler:
> >
> >
> >
> > /*
> >
> >  *  Licensed to the Apache Software Foundation (ASF) under one
> >
> >  *  or more contributor license agreements.  See the NOTICE file
> >
> >  *  distributed with this work for additional information
> >
> >  *  regarding copyright ownership.  The ASF licenses this file
> >
> >  *  to you under the Apache License, Version 2.0 (the
> >
> >  *  "License"); you may not use this file except in compliance
> >
> >  *  with the License.  You may obtain a copy of the License at
> >
> >  *
> >
> >  *    http://www.apache.org/licenses/LICENSE-2.0
> >
> >  *
> >
> >  *  Unless required by applicable law or agreed to in writing,
> >
> >  *  software distributed under the License is distributed on an
> >
> >  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >
> >  *  KIND, either express or implied.  See the License for the
> >
> >  *  specific language governing permissions and limitations
> >
> >  *  under the License.
> >
> >  *
> >
> >  */
> >
> > package test.mina.server;
> >
> >
> >
> > import java.util.Properties;
> >
> >
> >
> > import org.apache.mina.common.ByteBuffer;
> >
> > import org.apache.mina.common.IdleStatus;
> >
> > import org.apache.mina.common.IoHandler;
> >
> > import org.apache.mina.common.IoHandlerAdapter;
> >
> > import org.apache.mina.common.IoSession;
> >
> > import org.apache.mina.common.TransportType;
> >
> >
> >
> > import org.apache.mina.transport.socket.nio.SocketSessionConfig;
> >
> > import org.slf4j.Logger;
> >
> > import org.slf4j.LoggerFactory;
> >
> >
> >
> > import test.mina.TestRequest;
> >
> > import test.mina.TestResponse;
> >
> >
> >
> > public class EchoProtocolHandler extends IoHandlerAdapter {
> >
> >     private static final Logger log = LoggerFactory
> >
> >             .getLogger(EchoProtocolHandler.class);
> >
> >
> >
> >     public void sessionCreated(IoSession session) {
> >
> >         if (session.getTransportType() == TransportType.SOCKET) {
> >
> >            SocketSessionConfig config = (SocketSessionConfig)
> > session.getConfig();
> >
> >
> >
> >              config.setReceiveBufferSize(2048);
> >
> >              config.setSoLinger(0);
> >
> >         }
> >
> >
> >
> >         session.setIdleTime(IdleStatus.BOTH_IDLE, 10);
> >
> >
> >
> >     }
> >
> >
> >
> >     public void sessionIdle(IoSession session, IdleStatus status) {
> >
> >         log.info("*** IDLE #" +
session.getIdleCount(IdleStatus.BOTH_IDLE)
> >
> >                 + " ***");
> >
> >     }
> >
> >
> >
> >     public void exceptionCaught(IoSession session, Throwable cause) {
> >
> > //        cause.printStackTrace();
> >
> >         session.close();
> >
> >     }
> >
> >
> >
> >     public void messageReceived(IoSession session, Object message)
> >
> >             throws Exception {
> >
> >
> >
> >
> >
> >     TestRequest req = (TestRequest)message;
> >
> >     Processor p = new TESTProcessor();
> >
> >
> >
> >         TestResponse res = new TestResponse(0,"OK");// p.process( req );
> >
> >         session.write(res);
> >
> >
> >
> >         session.close();
> >
> >
> >
> >     }
> >
> > }
> >
> >
> >
> > TestRequest:
> >
> > package test.mina;
> >
> >
> >
> >
> >
> > import java.io.Serializable;
> >
> > import java.util.Enumeration;
> >
> > import java.util.Properties;
> >
> >
> >
> > public class TestRequest implements Serializable {
> >
> >
> >
> >          private String type;
> >
> >          private Properties data;
> >
> >
> >
> >          /**
> >
> >           * @param type
> >
> >           */
> >
> >          public TestRequest(String type) {
> >
> >                    this.type = type;
> >
> >          }
> >
> >
> >
> >          /**
> >
> >           * @param type
> >
> >           * @param data
> >
> >           */
> >
> >          public TestRequest(String type, Properties data) {
> >
> >                    this.type = type;
> >
> >                    this.data = data;
> >
> >          }
> >
> >
> >
> >          public Properties getData() {
> >
> >                    return data;
> >
> >          }
> >
> >
> >
> >          public void setData(Properties data) {
> >
> >                    this.data = data;
> >
> >          }
> >
> >
> >
> >          public String getType() {
> >
> >                    return type;
> >
> >          }
> >
> >
> >
> >          public void setKeyValue(String key,String value){
> >
> >                    if(data == null)
> >
> >                             data = new Properties();
> >
> >                    data.setProperty( key,value  );
> >
> >          }
> >
> >
> >
> >          public String getKeyValue(String key){
> >
> >                    if(data==null)return null;
> >
> >                    return data.getProperty(key);
> >
> >
> >
> >          }
> >
> >
> >
> >          @Override
> >
> >          public String toString() {
> >
> >                    StringBuffer buff= new StringBuffer();
> >
> >                    buff.append( "{[TestRequest]" );
> >
> >                    buff.append("[request type:" + type + "]");
> >
> >                    buff.append("[request data:");
> >
> >                    if( data!=null ){
> >
> >                             buff.append( data );
> >
> >                    }
> >
> >                    buff.append("]");
> >
> >
> >
> >                    buff.append("}");
> >
> >                    return buff.toString();
> >
> >
> >
> >
> >
> >
> >
> >          }
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > }
> >
> >
> >
> > TestResponse:
> >
> >
> >
> > package test.mina;
> >
> >
> >
> > import java.io.Serializable;
> >
> > import java.util.Properties;
> >
> >
> >
> > public class TestResponse implements Serializable {
> >
> >
> >
> >          private int err=0;
> >
> >          private String msg = "OK";
> >
> >
> >
> >          private Properties data;
> >
> >
> >
> >          public TestResponse(int err, String msg, Properties data) {
> >
> >                    this.err = err;
> >
> >                    this.msg = msg;
> >
> >                    this.data = data;
> >
> >          }
> >
> >
> >
> >
> >
> >          public TestResponse(int err, String msg){
> >
> >                    this(err,msg,null);
> >
> >          }
> >
> >
> >
> >
> >
> >          public Properties getData() {
> >
> >                    return data;
> >
> >          }
> >
> >
> >
> >
> >
> >          public void setData(Properties data) {
> >
> >                    this.data = data;
> >
> >          }
> >
> >
> >
> >
> >
> >          public int getErr() {
> >
> >                    return err;
> >
> >          }
> >
> >
> >
> >
> >
> >          public String getMsg() {
> >
> >                    return msg;
> >
> >          }
> >
> >
> >
> >
> >
> >
> >
> >          public String toString() {
> >
> >                    StringBuffer buff= new StringBuffer();
> >
> >                    buff.append( "{[TestResponse]" );
> >
> >                    buff.append("[response err:" + err + "]");
> >
> >                    buff.append("[response msg:" + msg + "]");
> >
> >                    buff.append("[response data:");
> >
> >                    if( data!=null ){
> >
> >                             buff.append( data );
> >
> >                    }
> >
> >                    buff.append("]");
> >
> >
> >
> >
> >
> >                    buff.append("}");
> >
> >                    return buff.toString();
> >
> >
> >
> >
> >
> >
> >
> >          }
> >
> >
> >
> > }
> >
> >
> >
> >
--------------------------------Client:-----------------------------------
> >
> > TestSign:
> >
> >
> >
> > package test.thread;
> >
> >
> >
> > import java.io.ByteArrayInputStream;
> >
> > import java.io.FileInputStream;
> >
> > import java.io.FileOutputStream;
> >
> > import java.io.PrintWriter;
> >
> > import java.security.KeyStore;
> >
> > import java.security.PrivateKey;
> >
> > import java.security.Security;
> >
> > import java.util.Enumeration;
> >
> >
> >
> > //import cn.com.infosec.jce.provider.InfosecProvider;
> >
> >
> >
> > /*
> >
> >  * Created on 2005-10-18
> >
> >  *
> >
> >  * TODO To change the template for this generated file go to
> >
> >  * Window - Preferences - Java - Code Style - Code Templates
> >
> >  */
> >
> >
> >
> > /**
> >
> >  * @author lixiangfeng
> >
> >  *
> >
> >  * TODO To change the template for this generated type comment go to
> >
> >  * Window - Preferences - Java - Code Style - Code Templates
> >
> >  */
> >
> > public class TestSign {
> >
> >
> >
> >
> >
> >          private static int finiCount = 0;
> >
> >          private static int failCount = 0;
> >
> >          public static Object synObj = new Object();
> >
> >          public static Object synObj2 = new Object();
> >
> >          public static Object synObj3 = new Object();
> >
> >          public static int threadCount = 0;
> >
> >          public static void main(String[] args) {
> >
> >
> >
> >                    try {
> >
> >                             int uCount = Integer.parseInt(args[0]);
> >
> >                             int uTime = Integer.parseInt(args[1]);
> >
> >
> >
> >
> >
> >                             FileOutputStream fos = new FileOutputStream(
> > "sign.log" );
> >
> >                             PrintWriter pr = new PrintWriter( fos );
> >
> >
> >
> >                             TestSignThread.init();
> >
> >
> >
> >
> >
> >                             for (int i = 0; i < uCount; i++) {
> >
> >                                      Thread th = new Thread(new
> > TestSignThread( uTime, pr ));
> >
> >                                      th.start();
> >
> >                             }
> >
> >
> >
> >                             threadCount = uCount;
> >
> >                             System.out.println("testcount:" +
> threadCount);
> >
> >                             System.out.println( "run time       :" +
uTime
> +
> > "s" );
> >
> >                             System.out.println("test running,please
> > wait...");
> >
> >                             while( threadCount>0){
> >
> >                                      Thread.sleep( 1000 );
> >
> >                             }
> >
> >
> >
> >                             System.out.println( "test finish......" );
> >
> >                             System.out.println( "finish count   :" +
> > finiCount );
> >
> >                             System.out.println( "failed count   :" +
> > failCount );
> >
> >                             System.out.println( "speed:" +
> (finiCount/uTime)
> > );
> >
> >
> >
> >
> >
> >
> >
> >                    } catch (Exception e) {
> >
> >                             e.printStackTrace();
> >
> >                    }
> >
> >          }
> >
> >
> >
> >
> >
> >          public static void incSucc(){
> >
> >                    synchronized(synObj){
> >
> >                             finiCount++;
> >
> >                    }
> >
> >          }
> >
> >
> >
> >          public static void incFail(){
> >
> >                    synchronized(synObj2){
> >
> >                             failCount++;
> >
> >                    }
> >
> >          }
> >
> >
> >
> >          public static void stopThread(){
> >
> >                    synchronized(synObj3){
> >
> >                             threadCount--;
> >
> >                    }
> >
> >          }
> >
> >
> >
> >
> >
> > }
> >
> >
> >
> >
> >
> > TestThread:
> >
> >
> >
> > package test.thread;
> >
> >
> >
> > import java.io.ByteArrayInputStream;
> >
> > import java.io.ByteArrayOutputStream;
> >
> > import java.io.DataInputStream;
> >
> > import java.io.DataOutputStream;
> >
> > import java.io.FileInputStream;
> >
> > import java.io.ObjectOutputStream;
> >
> > import java.io.PrintWriter;
> >
> > import java.net.InetSocketAddress;
> >
> > import java.net.Socket;
> >
> > import java.security.PrivateKey;
> >
> > import java.security.Security;
> >
> > import java.security.Signature;
> >
> > import java.text.ParseException;
> >
> > import java.text.SimpleDateFormat;
> >
> > import java.util.Date;
> >
> > import java.util.Properties;
> >
> > import java.util.TimeZone;
> >
> >
> >
> > import org.apache.mina.common.ConnectFuture;
> >
> > import org.apache.mina.common.IoSession;
> >
> > import org.apache.mina.common.RuntimeIOException;
> >
> > import org.apache.mina.filter.codec.ProtocolCodecFilter;
> >
> > import
> >
>
org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
> >
> > import org.apache.mina.transport.socket.nio.SocketConnector;
> >
> > import org.apache.mina.transport.socket.nio.SocketConnectorConfig;
> >
> >
> >
> > import test.mina.TestRequest;
> >
> > import test.mina.client.ClientSessionHandler;
> >
> >
> >
> > //import Test.TestResult;
> >
> > //
> >
> > //import cn.com.infosec.jce.provider.InfosecProvider;
> >
> > //import cn.com.infosec.netcert.crypto.CryptoHandler;
> >
> > //import cn.com.infosec.netcert.rads.CertManager;
> >
> > //import cn.com.infosec.netcert.rads.SysProperty;
> >
> > //import cn.com.infosec.netcert.rads.exception.CAException;
> >
> > //import cn.com.infosec.netcert.rads.exception.RAException;
> >
> > //import cn.com.infosec.netcert.resource.PropertiesKeysRes;
> >
> >
> >
> > /*
> >
> >  * Created on 2005-10-18
> >
> >  *
> >
> >  * TODO To change the template for this generated file go to
> >
> >  * Window - Preferences - Java - Code Style - Code Templates
> >
> >  */
> >
> >
> >
> > /**
> >
> >  * @author lixiangfeng
> >
> >  *
> >
> >  * TODO To change the template for this generated type comment go to
> >
> >  * Window - Preferences - Java - Code Style - Code Templates
> >
> >  */
> >
> > public class TestSignThread implements Runnable {
> >
> >
> >
> >
> >
> >          public long endTime = System.currentTimeMillis();
> >
> >          //public PrivateKey prik = null;
> >
> >          public PrintWriter pr = null;
> >
> >          public TestSignThread( int time, PrintWriter pr ){
> >
> >                    endTime += time * 1000;
> >
> >                    //this.prik = prik;
> >
> >                    this.pr = pr;
> >
> >          }
> >
> >
> >
> >          private static String basedn = "o=infosec";
> >
> >          private static String template = "EE_SIGNING";
> >
> >
> >
> >
> >
> >          public static void init() throws Exception{
> >
> >
> >
> >
> >
> >          }
> >
> >
> >
> >          public void run() {
> >
> >
> >
> >         SocketConnectorConfig cfg = new SocketConnectorConfig();
> >
> >         cfg.setConnectTimeout(30);
> >
> >         cfg.getSessionConfig().setSoLinger(0);
> >
> >
> >
> >             cfg.getFilterChain().addLast(
> >
> >                     "codec",
> >
> >                     new ProtocolCodecFilter(
> >
> >                             new ObjectSerializationCodecFactory()));
> >
> >
> >
> >
> >                    while( true ){
> >
> >                             if(endTime < System.currentTimeMillis() ){
> >
> >                                      TestSign.stopThread();
> >
> >                                      break;
> >
> >                             }
> >
> >
> >
> >
> >
> >
> >
> >                                     SocketConnector connector = new
> > SocketConnector();
> >
> >                                     connector.setWorkerTimeout(1);
> >
> >
> >
> >                                     IoSession session=null;
> >
> >                                         try {
> >
> >                                             ConnectFuture future =
> > connector.connect(new InetSocketAddress(
> >
> >                                                     "192.168.0.111",
> 8282),
> > new ClientSessionHandler(), cfg);
> >
> >
> >
> >                                             future.join();
> >
> >                                             session =
future.getSession();
> >
> >
> session.getCloseFuture().join();
> >
> >                                             TestSign.incSucc();
> >
> >                                             //break;
> >
> >                                         } catch (Exception e) {
> >
> >                                             e.printStackTrace( pr );
> >
> >                                             TestSign.incFail();
> >
> >                                         }
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >                    }
> >
> >
> >
> >          }
> >
> >
> >
> > }
> >
> >
> >
> > ClientHandler:
> >
> >
> >
> > /*
> >
> >  *  Licensed to the Apache Software Foundation (ASF) under one
> >
> >  *  or more contributor license agreements.  See the NOTICE file
> >
> >  *  distributed with this work for additional information
> >
> >  *  regarding copyright ownership.  The ASF licenses this file
> >
> >  *  to you under the Apache License, Version 2.0 (the
> >
> >  *  "License"); you may not use this file except in compliance
> >
> >  *  with the License.  You may obtain a copy of the License at
> >
> >  *
> >
> >  *    http://www.apache.org/licenses/LICENSE-2.0
> >
> >  *
> >
> >  *  Unless required by applicable law or agreed to in writing,
> >
> >  *  software distributed under the License is distributed on an
> >
> >  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >
> >  *  KIND, either express or implied.  See the License for the
> >
> >  *  specific language governing permissions and limitations
> >
> >  *  under the License.
> >
> >  *
> >
> >  */
> >
> > package test.mina.client;
> >
> >
> >
> > import java.util.Properties;
> >
> >
> >
> > import org.apache.mina.common.IoHandler;
> >
> > import org.apache.mina.common.IoHandlerAdapter;
> >
> > import org.apache.mina.common.IoSession;
> >
> > import org.apache.mina.transport.socket.nio.SocketSessionConfig;
> >
> >
> >
> > import test.mina.TestRequest;
> >
> > import test.mina.TestResponse;
> >
> >
> >
> > /**
> >
> >  * {@link IoHandler} for SumUp client.
> >
> >  *
> >
> >  * @author The Apache Directory Project (mina-dev@directory.apache.org)
> >
> >  * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (�?, 13  7
> �?
> > 2007) $
> >
> >  */
> >
> > public class ClientSessionHandler extends IoHandlerAdapter {
> >
> >     //private final int[] values;
> >
> >
> >
> >     private boolean finished;
> >
> >
> >
> >
> >
> >     public boolean isFinished() {
> >
> >         return finished;
> >
> >     }
> >
> >
> >
> >     public void sessionOpened(IoSession session) {
> >
> >
> >
> > //             System.out.println( "Thread" + Thread.currentThread() +
"
> > start at:" + System.currentTimeMillis()   );
> >
> > //             SocketSessionConfig config = session.getConfig();
> >
> > //             config.
> >
> >     //System.out.println( session.getConfig()   );
> >
> >     SocketSessionConfig config =
(SocketSessionConfig)session.getConfig();
> >
> >     config.setSoLinger(0);
> >
> >     TestRequest req = new TestRequest("TESTMINA");
> >
> >     Properties p1 = new Properties();
> >
> >     p1.setProperty("CARDSN","1111000000000068993");
> >
> >     req.setData(p1);
> >
> >     session.write(req);
> >
> >
> >
> >
> >
> >     }
> >
> >
> >
> >     public void messageReceived(IoSession session, Object message) {
> >
> >         // server only sends ResultMessage. otherwise, we will have to
> > identify
> >
> >         // its type using instanceof operator.
> >
> >         TestResponse res = (TestResponse)message;
> >
> > //        System.out.println( res );
> >
> >
> >
> >         session.close();
> >
> >     finished = true;
> >
> > //             System.out.println( "Thread" + Thread.currentThread() +
"
> > finish at:" + System.currentTimeMillis()   );
> >
> >
> >
> >     }
> >
> >
> >
> >     public void exceptionCaught(IoSession session, Throwable cause) {
> >
> >         session.close();
> >
> >     }
> >
> > }
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
>
>
> --
> what we call human nature is actually human habit
> --
> http://gleamynode.net/
> --
> PGP Key ID: 0x0255ECA6
>
>


-- 
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP Key ID: 0x0255ECA6


Re: 答复: Mina Performance

Posted by Trustin Lee <tr...@gmail.com>.
Please try to post an attachment here:

http://www.nabble.com/Apache-MINA-Support-Forum-f16869.html

Please let me know if it doesn't work.

Trustin

On 9/18/07, ����� <li...@infosec.com.cn> wrote:
>
> Sorry, the mail server reject my mail with attatchment ,please help check
> this code,thanks.
>
> -----�ʼ�ԭ��-----
> ������: Trustin Lee [mailto:trustin@gmail.com]
> ����ʱ��: 2007��9��18�� 10:06
> �ռ���: dev@mina.apache.org
> ����: Re: Mina Performance
>
> Hi,
>
> Could you zip the source code files and attach to our support forum?
>
> Thanks,
> Trustin
>
> On 9/18/07, ����� <li...@infosec.com.cn> wrote:
> > Hello, I Write a Server Demo use Mina-1.1.2,use the
> > ObjectSerializationCodecFactory. But When Run This Server,Use a 100
> threads
> > Client to test it's performance,it's performance is poor. Server machine
> > is  2CPU *2.8G,1G memory ,Suse Linux  9. It Tran/sec only 60~80. I past
> the
> > code under, who can help me?
> >
> >
> >
> > Then,I Run the HttpServer exsample  from Mina1.1.2 in same machine, I use
> > the apche ab test it.When I use apace ab in 50 concurrency,it performance
> > Trans/Sec is 4800,but when I use 100 or more concurrency,it performance is
> > very poor, only 100~200 trans/sec. I cannot understand it ,who can tell me
> > why?
> >
> >
> >
> >
> -------------------------------------------Server:--------------------------
> > -----------------------
> >
> >
> >
> > Main.java
> >
> >
> >
> > /*
> >
> >  *  Licensed to the Apache Software Foundation (ASF) under one
> >
> >  *  or more contributor license agreements.  See the NOTICE file
> >
> >  *  distributed with this work for additional information
> >
> >  *  regarding copyright ownership.  The ASF licenses this file
> >
> >  *  to you under the Apache License, Version 2.0 (the
> >
> >  *  "License"); you may not use this file except in compliance
> >
> >  *  with the License.  You may obtain a copy of the License at
> >
> >  *
> >
> >  *    http://www.apache.org/licenses/LICENSE-2.0
> >
> >  *
> >
> >  *  Unless required by applicable law or agreed to in writing,
> >
> >  *  software distributed under the License is distributed on an
> >
> >  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >
> >  *  KIND, either express or implied.  See the License for the
> >
> >  *  specific language governing permissions and limitations
> >
> >  *  under the License.
> >
> >  *
> >
> >  */
> >
> > package test.mina.server;
> >
> >
> >
> > import java.net.InetSocketAddress;
> >
> > import java.util.concurrent.Executors;
> >
> >
> >
> > import org.apache.mina.common.DefaultIoFilterChainBuilder;
> >
> > import org.apache.mina.common.IoAcceptor;
> >
> > import org.apache.mina.filter.LoggingFilter;
> >
> > import org.apache.mina.filter.codec.ProtocolCodecFilter;
> >
> > import
> >
> org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
> >
> > import org.apache.mina.filter.executor.ExecutorFilter;
> >
> > import org.apache.mina.transport.socket.nio.SocketAcceptor;
> >
> > import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
> >
> >
> >
> > /**
> >
> >  * (<b>Entry point</b>) Echo server
> >
> >  *
> >
> >  * @author The Apache Directory Project (mina-dev@directory.apache.org)
> >
> >  * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (�?, 13  7
> �?
> > 2007) $
> >
> >  */
> >
> > public class Main {
> >
> >     /** Choose your favorite port number. */
> >
> >     private static final int PORT = 8282;
> >
> >
> >
> >     /** Set this to true if you want to make the server SSL */
> >
> >     private static final boolean USE_SSL = false;
> >
> >
> >
> >     public static void main(String[] args) throws Exception {
> >
> > //        IoAcceptor acceptor = new SocketAcceptor();
> >
> >         //IoAcceptorConfig config = new SocketAcceptorConfig();
> >
> >         IoAcceptor acceptor = new SocketAcceptor(4,
> > Executors.newCachedThreadPool());
> >
> >         SocketAcceptorConfig config = new SocketAcceptorConfig();
> >
> >
> >
> > //        config.setReuseAddress(true);
> >
> >         config.setBacklog(30);
> >
> >
> >
> > //        Storager.create();
> >
> > //        config.getFilterChain().addLast(
> >
> > //                "protocolFilter",
> >
> > //                new ProtocolCodecFilter(
> >
> > //                             new TestProtocolCodecFactory(false)));
> >
> >
> >
> >       config.getFilterChain().addLast(
> >
> >       "protocolFilter",
> >
> >       new ProtocolCodecFilter(
> >
> >               new ObjectSerializationCodecFactory()));
> >
> >
> >
> >
> >
> >
> >
> >         DefaultIoFilterChainBuilder chain = config.getFilterChain();
> >
> >
> >
> >         chain.addLast("threadPool", new
> > ExecutorFilter(Executors.newCachedThreadPool()) );
> >
> >
> >
> > //        addLogger(chain);
> >
> >
> >
> >         // Bind
> >
> >         acceptor.bind(new InetSocketAddress(PORT), new
> > EchoProtocolHandler(),
> >
> >                 config);
> >
> >
> >
> >         System.out.println("Listening on port " + PORT);
> >
> >     }
> >
> >
> >
> >
> >
> >
> >
> >     private static void addLogger(DefaultIoFilterChainBuilder chain)
> >
> >             throws Exception {
> >
> >         chain.addLast("logger", new LoggingFilter());
> >
> >         System.out.println("Logging ON");
> >
> >     }
> >
> > }
> >
> >
> >
> > Handler:
> >
> >
> >
> > /*
> >
> >  *  Licensed to the Apache Software Foundation (ASF) under one
> >
> >  *  or more contributor license agreements.  See the NOTICE file
> >
> >  *  distributed with this work for additional information
> >
> >  *  regarding copyright ownership.  The ASF licenses this file
> >
> >  *  to you under the Apache License, Version 2.0 (the
> >
> >  *  "License"); you may not use this file except in compliance
> >
> >  *  with the License.  You may obtain a copy of the License at
> >
> >  *
> >
> >  *    http://www.apache.org/licenses/LICENSE-2.0
> >
> >  *
> >
> >  *  Unless required by applicable law or agreed to in writing,
> >
> >  *  software distributed under the License is distributed on an
> >
> >  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >
> >  *  KIND, either express or implied.  See the License for the
> >
> >  *  specific language governing permissions and limitations
> >
> >  *  under the License.
> >
> >  *
> >
> >  */
> >
> > package test.mina.server;
> >
> >
> >
> > import java.util.Properties;
> >
> >
> >
> > import org.apache.mina.common.ByteBuffer;
> >
> > import org.apache.mina.common.IdleStatus;
> >
> > import org.apache.mina.common.IoHandler;
> >
> > import org.apache.mina.common.IoHandlerAdapter;
> >
> > import org.apache.mina.common.IoSession;
> >
> > import org.apache.mina.common.TransportType;
> >
> >
> >
> > import org.apache.mina.transport.socket.nio.SocketSessionConfig;
> >
> > import org.slf4j.Logger;
> >
> > import org.slf4j.LoggerFactory;
> >
> >
> >
> > import test.mina.TestRequest;
> >
> > import test.mina.TestResponse;
> >
> >
> >
> > public class EchoProtocolHandler extends IoHandlerAdapter {
> >
> >     private static final Logger log = LoggerFactory
> >
> >             .getLogger(EchoProtocolHandler.class);
> >
> >
> >
> >     public void sessionCreated(IoSession session) {
> >
> >         if (session.getTransportType() == TransportType.SOCKET) {
> >
> >            SocketSessionConfig config = (SocketSessionConfig)
> > session.getConfig();
> >
> >
> >
> >              config.setReceiveBufferSize(2048);
> >
> >              config.setSoLinger(0);
> >
> >         }
> >
> >
> >
> >         session.setIdleTime(IdleStatus.BOTH_IDLE, 10);
> >
> >
> >
> >     }
> >
> >
> >
> >     public void sessionIdle(IoSession session, IdleStatus status) {
> >
> >         log.info("*** IDLE #" + session.getIdleCount(IdleStatus.BOTH_IDLE)
> >
> >                 + " ***");
> >
> >     }
> >
> >
> >
> >     public void exceptionCaught(IoSession session, Throwable cause) {
> >
> > //        cause.printStackTrace();
> >
> >         session.close();
> >
> >     }
> >
> >
> >
> >     public void messageReceived(IoSession session, Object message)
> >
> >             throws Exception {
> >
> >
> >
> >
> >
> >     TestRequest req = (TestRequest)message;
> >
> >     Processor p = new TESTProcessor();
> >
> >
> >
> >         TestResponse res = new TestResponse(0,"OK");// p.process( req );
> >
> >         session.write(res);
> >
> >
> >
> >         session.close();
> >
> >
> >
> >     }
> >
> > }
> >
> >
> >
> > TestRequest:
> >
> > package test.mina;
> >
> >
> >
> >
> >
> > import java.io.Serializable;
> >
> > import java.util.Enumeration;
> >
> > import java.util.Properties;
> >
> >
> >
> > public class TestRequest implements Serializable {
> >
> >
> >
> >          private String type;
> >
> >          private Properties data;
> >
> >
> >
> >          /**
> >
> >           * @param type
> >
> >           */
> >
> >          public TestRequest(String type) {
> >
> >                    this.type = type;
> >
> >          }
> >
> >
> >
> >          /**
> >
> >           * @param type
> >
> >           * @param data
> >
> >           */
> >
> >          public TestRequest(String type, Properties data) {
> >
> >                    this.type = type;
> >
> >                    this.data = data;
> >
> >          }
> >
> >
> >
> >          public Properties getData() {
> >
> >                    return data;
> >
> >          }
> >
> >
> >
> >          public void setData(Properties data) {
> >
> >                    this.data = data;
> >
> >          }
> >
> >
> >
> >          public String getType() {
> >
> >                    return type;
> >
> >          }
> >
> >
> >
> >          public void setKeyValue(String key,String value){
> >
> >                    if(data == null)
> >
> >                             data = new Properties();
> >
> >                    data.setProperty( key,value  );
> >
> >          }
> >
> >
> >
> >          public String getKeyValue(String key){
> >
> >                    if(data==null)return null;
> >
> >                    return data.getProperty(key);
> >
> >
> >
> >          }
> >
> >
> >
> >          @Override
> >
> >          public String toString() {
> >
> >                    StringBuffer buff= new StringBuffer();
> >
> >                    buff.append( "{[TestRequest]" );
> >
> >                    buff.append("[request type:" + type + "]");
> >
> >                    buff.append("[request data:");
> >
> >                    if( data!=null ){
> >
> >                             buff.append( data );
> >
> >                    }
> >
> >                    buff.append("]");
> >
> >
> >
> >                    buff.append("}");
> >
> >                    return buff.toString();
> >
> >
> >
> >
> >
> >
> >
> >          }
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > }
> >
> >
> >
> > TestResponse:
> >
> >
> >
> > package test.mina;
> >
> >
> >
> > import java.io.Serializable;
> >
> > import java.util.Properties;
> >
> >
> >
> > public class TestResponse implements Serializable {
> >
> >
> >
> >          private int err=0;
> >
> >          private String msg = "OK";
> >
> >
> >
> >          private Properties data;
> >
> >
> >
> >          public TestResponse(int err, String msg, Properties data) {
> >
> >                    this.err = err;
> >
> >                    this.msg = msg;
> >
> >                    this.data = data;
> >
> >          }
> >
> >
> >
> >
> >
> >          public TestResponse(int err, String msg){
> >
> >                    this(err,msg,null);
> >
> >          }
> >
> >
> >
> >
> >
> >          public Properties getData() {
> >
> >                    return data;
> >
> >          }
> >
> >
> >
> >
> >
> >          public void setData(Properties data) {
> >
> >                    this.data = data;
> >
> >          }
> >
> >
> >
> >
> >
> >          public int getErr() {
> >
> >                    return err;
> >
> >          }
> >
> >
> >
> >
> >
> >          public String getMsg() {
> >
> >                    return msg;
> >
> >          }
> >
> >
> >
> >
> >
> >
> >
> >          public String toString() {
> >
> >                    StringBuffer buff= new StringBuffer();
> >
> >                    buff.append( "{[TestResponse]" );
> >
> >                    buff.append("[response err:" + err + "]");
> >
> >                    buff.append("[response msg:" + msg + "]");
> >
> >                    buff.append("[response data:");
> >
> >                    if( data!=null ){
> >
> >                             buff.append( data );
> >
> >                    }
> >
> >                    buff.append("]");
> >
> >
> >
> >
> >
> >                    buff.append("}");
> >
> >                    return buff.toString();
> >
> >
> >
> >
> >
> >
> >
> >          }
> >
> >
> >
> > }
> >
> >
> >
> > --------------------------------Client:-----------------------------------
> >
> > TestSign:
> >
> >
> >
> > package test.thread;
> >
> >
> >
> > import java.io.ByteArrayInputStream;
> >
> > import java.io.FileInputStream;
> >
> > import java.io.FileOutputStream;
> >
> > import java.io.PrintWriter;
> >
> > import java.security.KeyStore;
> >
> > import java.security.PrivateKey;
> >
> > import java.security.Security;
> >
> > import java.util.Enumeration;
> >
> >
> >
> > //import cn.com.infosec.jce.provider.InfosecProvider;
> >
> >
> >
> > /*
> >
> >  * Created on 2005-10-18
> >
> >  *
> >
> >  * TODO To change the template for this generated file go to
> >
> >  * Window - Preferences - Java - Code Style - Code Templates
> >
> >  */
> >
> >
> >
> > /**
> >
> >  * @author lixiangfeng
> >
> >  *
> >
> >  * TODO To change the template for this generated type comment go to
> >
> >  * Window - Preferences - Java - Code Style - Code Templates
> >
> >  */
> >
> > public class TestSign {
> >
> >
> >
> >
> >
> >          private static int finiCount = 0;
> >
> >          private static int failCount = 0;
> >
> >          public static Object synObj = new Object();
> >
> >          public static Object synObj2 = new Object();
> >
> >          public static Object synObj3 = new Object();
> >
> >          public static int threadCount = 0;
> >
> >          public static void main(String[] args) {
> >
> >
> >
> >                    try {
> >
> >                             int uCount = Integer.parseInt(args[0]);
> >
> >                             int uTime = Integer.parseInt(args[1]);
> >
> >
> >
> >
> >
> >                             FileOutputStream fos = new FileOutputStream(
> > "sign.log" );
> >
> >                             PrintWriter pr = new PrintWriter( fos );
> >
> >
> >
> >                             TestSignThread.init();
> >
> >
> >
> >
> >
> >                             for (int i = 0; i < uCount; i++) {
> >
> >                                      Thread th = new Thread(new
> > TestSignThread( uTime, pr ));
> >
> >                                      th.start();
> >
> >                             }
> >
> >
> >
> >                             threadCount = uCount;
> >
> >                             System.out.println("testcount:" +
> threadCount);
> >
> >                             System.out.println( "run time       :" + uTime
> +
> > "s" );
> >
> >                             System.out.println("test running,please
> > wait...");
> >
> >                             while( threadCount>0){
> >
> >                                      Thread.sleep( 1000 );
> >
> >                             }
> >
> >
> >
> >                             System.out.println( "test finish......" );
> >
> >                             System.out.println( "finish count   :" +
> > finiCount );
> >
> >                             System.out.println( "failed count   :" +
> > failCount );
> >
> >                             System.out.println( "speed:" +
> (finiCount/uTime)
> > );
> >
> >
> >
> >
> >
> >
> >
> >                    } catch (Exception e) {
> >
> >                             e.printStackTrace();
> >
> >                    }
> >
> >          }
> >
> >
> >
> >
> >
> >          public static void incSucc(){
> >
> >                    synchronized(synObj){
> >
> >                             finiCount++;
> >
> >                    }
> >
> >          }
> >
> >
> >
> >          public static void incFail(){
> >
> >                    synchronized(synObj2){
> >
> >                             failCount++;
> >
> >                    }
> >
> >          }
> >
> >
> >
> >          public static void stopThread(){
> >
> >                    synchronized(synObj3){
> >
> >                             threadCount--;
> >
> >                    }
> >
> >          }
> >
> >
> >
> >
> >
> > }
> >
> >
> >
> >
> >
> > TestThread:
> >
> >
> >
> > package test.thread;
> >
> >
> >
> > import java.io.ByteArrayInputStream;
> >
> > import java.io.ByteArrayOutputStream;
> >
> > import java.io.DataInputStream;
> >
> > import java.io.DataOutputStream;
> >
> > import java.io.FileInputStream;
> >
> > import java.io.ObjectOutputStream;
> >
> > import java.io.PrintWriter;
> >
> > import java.net.InetSocketAddress;
> >
> > import java.net.Socket;
> >
> > import java.security.PrivateKey;
> >
> > import java.security.Security;
> >
> > import java.security.Signature;
> >
> > import java.text.ParseException;
> >
> > import java.text.SimpleDateFormat;
> >
> > import java.util.Date;
> >
> > import java.util.Properties;
> >
> > import java.util.TimeZone;
> >
> >
> >
> > import org.apache.mina.common.ConnectFuture;
> >
> > import org.apache.mina.common.IoSession;
> >
> > import org.apache.mina.common.RuntimeIOException;
> >
> > import org.apache.mina.filter.codec.ProtocolCodecFilter;
> >
> > import
> >
> org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
> >
> > import org.apache.mina.transport.socket.nio.SocketConnector;
> >
> > import org.apache.mina.transport.socket.nio.SocketConnectorConfig;
> >
> >
> >
> > import test.mina.TestRequest;
> >
> > import test.mina.client.ClientSessionHandler;
> >
> >
> >
> > //import Test.TestResult;
> >
> > //
> >
> > //import cn.com.infosec.jce.provider.InfosecProvider;
> >
> > //import cn.com.infosec.netcert.crypto.CryptoHandler;
> >
> > //import cn.com.infosec.netcert.rads.CertManager;
> >
> > //import cn.com.infosec.netcert.rads.SysProperty;
> >
> > //import cn.com.infosec.netcert.rads.exception.CAException;
> >
> > //import cn.com.infosec.netcert.rads.exception.RAException;
> >
> > //import cn.com.infosec.netcert.resource.PropertiesKeysRes;
> >
> >
> >
> > /*
> >
> >  * Created on 2005-10-18
> >
> >  *
> >
> >  * TODO To change the template for this generated file go to
> >
> >  * Window - Preferences - Java - Code Style - Code Templates
> >
> >  */
> >
> >
> >
> > /**
> >
> >  * @author lixiangfeng
> >
> >  *
> >
> >  * TODO To change the template for this generated type comment go to
> >
> >  * Window - Preferences - Java - Code Style - Code Templates
> >
> >  */
> >
> > public class TestSignThread implements Runnable {
> >
> >
> >
> >
> >
> >          public long endTime = System.currentTimeMillis();
> >
> >          //public PrivateKey prik = null;
> >
> >          public PrintWriter pr = null;
> >
> >          public TestSignThread( int time, PrintWriter pr ){
> >
> >                    endTime += time * 1000;
> >
> >                    //this.prik = prik;
> >
> >                    this.pr = pr;
> >
> >          }
> >
> >
> >
> >          private static String basedn = "o=infosec";
> >
> >          private static String template = "EE_SIGNING";
> >
> >
> >
> >
> >
> >          public static void init() throws Exception{
> >
> >
> >
> >
> >
> >          }
> >
> >
> >
> >          public void run() {
> >
> >
> >
> >         SocketConnectorConfig cfg = new SocketConnectorConfig();
> >
> >         cfg.setConnectTimeout(30);
> >
> >         cfg.getSessionConfig().setSoLinger(0);
> >
> >
> >
> >             cfg.getFilterChain().addLast(
> >
> >                     "codec",
> >
> >                     new ProtocolCodecFilter(
> >
> >                             new ObjectSerializationCodecFactory()));
> >
> >
> >
> >
> >                    while( true ){
> >
> >                             if(endTime < System.currentTimeMillis() ){
> >
> >                                      TestSign.stopThread();
> >
> >                                      break;
> >
> >                             }
> >
> >
> >
> >
> >
> >
> >
> >                                     SocketConnector connector = new
> > SocketConnector();
> >
> >                                     connector.setWorkerTimeout(1);
> >
> >
> >
> >                                     IoSession session=null;
> >
> >                                         try {
> >
> >                                             ConnectFuture future =
> > connector.connect(new InetSocketAddress(
> >
> >                                                     "192.168.0.111",
> 8282),
> > new ClientSessionHandler(), cfg);
> >
> >
> >
> >                                             future.join();
> >
> >                                             session = future.getSession();
> >
> >
> session.getCloseFuture().join();
> >
> >                                             TestSign.incSucc();
> >
> >                                             //break;
> >
> >                                         } catch (Exception e) {
> >
> >                                             e.printStackTrace( pr );
> >
> >                                             TestSign.incFail();
> >
> >                                         }
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >                    }
> >
> >
> >
> >          }
> >
> >
> >
> > }
> >
> >
> >
> > ClientHandler:
> >
> >
> >
> > /*
> >
> >  *  Licensed to the Apache Software Foundation (ASF) under one
> >
> >  *  or more contributor license agreements.  See the NOTICE file
> >
> >  *  distributed with this work for additional information
> >
> >  *  regarding copyright ownership.  The ASF licenses this file
> >
> >  *  to you under the Apache License, Version 2.0 (the
> >
> >  *  "License"); you may not use this file except in compliance
> >
> >  *  with the License.  You may obtain a copy of the License at
> >
> >  *
> >
> >  *    http://www.apache.org/licenses/LICENSE-2.0
> >
> >  *
> >
> >  *  Unless required by applicable law or agreed to in writing,
> >
> >  *  software distributed under the License is distributed on an
> >
> >  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> >
> >  *  KIND, either express or implied.  See the License for the
> >
> >  *  specific language governing permissions and limitations
> >
> >  *  under the License.
> >
> >  *
> >
> >  */
> >
> > package test.mina.client;
> >
> >
> >
> > import java.util.Properties;
> >
> >
> >
> > import org.apache.mina.common.IoHandler;
> >
> > import org.apache.mina.common.IoHandlerAdapter;
> >
> > import org.apache.mina.common.IoSession;
> >
> > import org.apache.mina.transport.socket.nio.SocketSessionConfig;
> >
> >
> >
> > import test.mina.TestRequest;
> >
> > import test.mina.TestResponse;
> >
> >
> >
> > /**
> >
> >  * {@link IoHandler} for SumUp client.
> >
> >  *
> >
> >  * @author The Apache Directory Project (mina-dev@directory.apache.org)
> >
> >  * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (�?, 13  7
> �?
> > 2007) $
> >
> >  */
> >
> > public class ClientSessionHandler extends IoHandlerAdapter {
> >
> >     //private final int[] values;
> >
> >
> >
> >     private boolean finished;
> >
> >
> >
> >
> >
> >     public boolean isFinished() {
> >
> >         return finished;
> >
> >     }
> >
> >
> >
> >     public void sessionOpened(IoSession session) {
> >
> >
> >
> > //             System.out.println( "Thread" + Thread.currentThread() +  "
> > start at:" + System.currentTimeMillis()   );
> >
> > //             SocketSessionConfig config = session.getConfig();
> >
> > //             config.
> >
> >     //System.out.println( session.getConfig()   );
> >
> >     SocketSessionConfig config = (SocketSessionConfig)session.getConfig();
> >
> >     config.setSoLinger(0);
> >
> >     TestRequest req = new TestRequest("TESTMINA");
> >
> >     Properties p1 = new Properties();
> >
> >     p1.setProperty("CARDSN","1111000000000068993");
> >
> >     req.setData(p1);
> >
> >     session.write(req);
> >
> >
> >
> >
> >
> >     }
> >
> >
> >
> >     public void messageReceived(IoSession session, Object message) {
> >
> >         // server only sends ResultMessage. otherwise, we will have to
> > identify
> >
> >         // its type using instanceof operator.
> >
> >         TestResponse res = (TestResponse)message;
> >
> > //        System.out.println( res );
> >
> >
> >
> >         session.close();
> >
> >     finished = true;
> >
> > //             System.out.println( "Thread" + Thread.currentThread() +  "
> > finish at:" + System.currentTimeMillis()   );
> >
> >
> >
> >     }
> >
> >
> >
> >     public void exceptionCaught(IoSession session, Throwable cause) {
> >
> >         session.close();
> >
> >     }
> >
> > }
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
>
>
> --
> what we call human nature is actually human habit
> --
> http://gleamynode.net/
> --
> PGP Key ID: 0x0255ECA6
>
>


-- 
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP Key ID: 0x0255ECA6

答复: Mina Performance

Posted by 李向锋 <li...@infosec.com.cn>.
Sorry, the mail server reject my mail with attatchment ,please help check
this code,thanks.

-----�ʼ�ԭ��-----
������: Trustin Lee [mailto:trustin@gmail.com] 
����ʱ��: 2007��9��18�� 10:06
�ռ���: dev@mina.apache.org
����: Re: Mina Performance

Hi,

Could you zip the source code files and attach to our support forum?

Thanks,
Trustin

On 9/18/07, ����� <li...@infosec.com.cn> wrote:
> Hello, I Write a Server Demo use Mina-1.1.2,use the
> ObjectSerializationCodecFactory. But When Run This Server,Use a 100
threads
> Client to test it's performance,it's performance is poor. Server machine
> is  2CPU *2.8G,1G memory ,Suse Linux  9. It Tran/sec only 60~80. I past
the
> code under, who can help me?
>
>
>
> Then,I Run the HttpServer exsample  from Mina1.1.2 in same machine, I use
> the apche ab test it.When I use apace ab in 50 concurrency,it performance
> Trans/Sec is 4800,but when I use 100 or more concurrency,it performance is
> very poor, only 100~200 trans/sec. I cannot understand it ,who can tell me
> why?
>
>
>
>
-------------------------------------------Server:--------------------------
> -----------------------
>
>
>
> Main.java
>
>
>
> /*
>
>  *  Licensed to the Apache Software Foundation (ASF) under one
>
>  *  or more contributor license agreements.  See the NOTICE file
>
>  *  distributed with this work for additional information
>
>  *  regarding copyright ownership.  The ASF licenses this file
>
>  *  to you under the Apache License, Version 2.0 (the
>
>  *  "License"); you may not use this file except in compliance
>
>  *  with the License.  You may obtain a copy of the License at
>
>  *
>
>  *    http://www.apache.org/licenses/LICENSE-2.0
>
>  *
>
>  *  Unless required by applicable law or agreed to in writing,
>
>  *  software distributed under the License is distributed on an
>
>  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>
>  *  KIND, either express or implied.  See the License for the
>
>  *  specific language governing permissions and limitations
>
>  *  under the License.
>
>  *
>
>  */
>
> package test.mina.server;
>
>
>
> import java.net.InetSocketAddress;
>
> import java.util.concurrent.Executors;
>
>
>
> import org.apache.mina.common.DefaultIoFilterChainBuilder;
>
> import org.apache.mina.common.IoAcceptor;
>
> import org.apache.mina.filter.LoggingFilter;
>
> import org.apache.mina.filter.codec.ProtocolCodecFilter;
>
> import
>
org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
>
> import org.apache.mina.filter.executor.ExecutorFilter;
>
> import org.apache.mina.transport.socket.nio.SocketAcceptor;
>
> import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
>
>
>
> /**
>
>  * (<b>Entry point</b>) Echo server
>
>  *
>
>  * @author The Apache Directory Project (mina-dev@directory.apache.org)
>
>  * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (�?, 13  7
�?
> 2007) $
>
>  */
>
> public class Main {
>
>     /** Choose your favorite port number. */
>
>     private static final int PORT = 8282;
>
>
>
>     /** Set this to true if you want to make the server SSL */
>
>     private static final boolean USE_SSL = false;
>
>
>
>     public static void main(String[] args) throws Exception {
>
> //        IoAcceptor acceptor = new SocketAcceptor();
>
>         //IoAcceptorConfig config = new SocketAcceptorConfig();
>
>         IoAcceptor acceptor = new SocketAcceptor(4,
> Executors.newCachedThreadPool());
>
>         SocketAcceptorConfig config = new SocketAcceptorConfig();
>
>
>
> //        config.setReuseAddress(true);
>
>         config.setBacklog(30);
>
>
>
> //        Storager.create();
>
> //        config.getFilterChain().addLast(
>
> //                "protocolFilter",
>
> //                new ProtocolCodecFilter(
>
> //                             new TestProtocolCodecFactory(false)));
>
>
>
>       config.getFilterChain().addLast(
>
>       "protocolFilter",
>
>       new ProtocolCodecFilter(
>
>               new ObjectSerializationCodecFactory()));
>
>
>
>
>
>
>
>         DefaultIoFilterChainBuilder chain = config.getFilterChain();
>
>
>
>         chain.addLast("threadPool", new
> ExecutorFilter(Executors.newCachedThreadPool()) );
>
>
>
> //        addLogger(chain);
>
>
>
>         // Bind
>
>         acceptor.bind(new InetSocketAddress(PORT), new
> EchoProtocolHandler(),
>
>                 config);
>
>
>
>         System.out.println("Listening on port " + PORT);
>
>     }
>
>
>
>
>
>
>
>     private static void addLogger(DefaultIoFilterChainBuilder chain)
>
>             throws Exception {
>
>         chain.addLast("logger", new LoggingFilter());
>
>         System.out.println("Logging ON");
>
>     }
>
> }
>
>
>
> Handler:
>
>
>
> /*
>
>  *  Licensed to the Apache Software Foundation (ASF) under one
>
>  *  or more contributor license agreements.  See the NOTICE file
>
>  *  distributed with this work for additional information
>
>  *  regarding copyright ownership.  The ASF licenses this file
>
>  *  to you under the Apache License, Version 2.0 (the
>
>  *  "License"); you may not use this file except in compliance
>
>  *  with the License.  You may obtain a copy of the License at
>
>  *
>
>  *    http://www.apache.org/licenses/LICENSE-2.0
>
>  *
>
>  *  Unless required by applicable law or agreed to in writing,
>
>  *  software distributed under the License is distributed on an
>
>  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>
>  *  KIND, either express or implied.  See the License for the
>
>  *  specific language governing permissions and limitations
>
>  *  under the License.
>
>  *
>
>  */
>
> package test.mina.server;
>
>
>
> import java.util.Properties;
>
>
>
> import org.apache.mina.common.ByteBuffer;
>
> import org.apache.mina.common.IdleStatus;
>
> import org.apache.mina.common.IoHandler;
>
> import org.apache.mina.common.IoHandlerAdapter;
>
> import org.apache.mina.common.IoSession;
>
> import org.apache.mina.common.TransportType;
>
>
>
> import org.apache.mina.transport.socket.nio.SocketSessionConfig;
>
> import org.slf4j.Logger;
>
> import org.slf4j.LoggerFactory;
>
>
>
> import test.mina.TestRequest;
>
> import test.mina.TestResponse;
>
>
>
> public class EchoProtocolHandler extends IoHandlerAdapter {
>
>     private static final Logger log = LoggerFactory
>
>             .getLogger(EchoProtocolHandler.class);
>
>
>
>     public void sessionCreated(IoSession session) {
>
>         if (session.getTransportType() == TransportType.SOCKET) {
>
>            SocketSessionConfig config = (SocketSessionConfig)
> session.getConfig();
>
>
>
>              config.setReceiveBufferSize(2048);
>
>              config.setSoLinger(0);
>
>         }
>
>
>
>         session.setIdleTime(IdleStatus.BOTH_IDLE, 10);
>
>
>
>     }
>
>
>
>     public void sessionIdle(IoSession session, IdleStatus status) {
>
>         log.info("*** IDLE #" + session.getIdleCount(IdleStatus.BOTH_IDLE)
>
>                 + " ***");
>
>     }
>
>
>
>     public void exceptionCaught(IoSession session, Throwable cause) {
>
> //        cause.printStackTrace();
>
>         session.close();
>
>     }
>
>
>
>     public void messageReceived(IoSession session, Object message)
>
>             throws Exception {
>
>
>
>
>
>     TestRequest req = (TestRequest)message;
>
>     Processor p = new TESTProcessor();
>
>
>
>         TestResponse res = new TestResponse(0,"OK");// p.process( req );
>
>         session.write(res);
>
>
>
>         session.close();
>
>
>
>     }
>
> }
>
>
>
> TestRequest:
>
> package test.mina;
>
>
>
>
>
> import java.io.Serializable;
>
> import java.util.Enumeration;
>
> import java.util.Properties;
>
>
>
> public class TestRequest implements Serializable {
>
>
>
>          private String type;
>
>          private Properties data;
>
>
>
>          /**
>
>           * @param type
>
>           */
>
>          public TestRequest(String type) {
>
>                    this.type = type;
>
>          }
>
>
>
>          /**
>
>           * @param type
>
>           * @param data
>
>           */
>
>          public TestRequest(String type, Properties data) {
>
>                    this.type = type;
>
>                    this.data = data;
>
>          }
>
>
>
>          public Properties getData() {
>
>                    return data;
>
>          }
>
>
>
>          public void setData(Properties data) {
>
>                    this.data = data;
>
>          }
>
>
>
>          public String getType() {
>
>                    return type;
>
>          }
>
>
>
>          public void setKeyValue(String key,String value){
>
>                    if(data == null)
>
>                             data = new Properties();
>
>                    data.setProperty( key,value  );
>
>          }
>
>
>
>          public String getKeyValue(String key){
>
>                    if(data==null)return null;
>
>                    return data.getProperty(key);
>
>
>
>          }
>
>
>
>          @Override
>
>          public String toString() {
>
>                    StringBuffer buff= new StringBuffer();
>
>                    buff.append( "{[TestRequest]" );
>
>                    buff.append("[request type:" + type + "]");
>
>                    buff.append("[request data:");
>
>                    if( data!=null ){
>
>                             buff.append( data );
>
>                    }
>
>                    buff.append("]");
>
>
>
>                    buff.append("}");
>
>                    return buff.toString();
>
>
>
>
>
>
>
>          }
>
>
>
>
>
>
>
>
>
> }
>
>
>
> TestResponse:
>
>
>
> package test.mina;
>
>
>
> import java.io.Serializable;
>
> import java.util.Properties;
>
>
>
> public class TestResponse implements Serializable {
>
>
>
>          private int err=0;
>
>          private String msg = "OK";
>
>
>
>          private Properties data;
>
>
>
>          public TestResponse(int err, String msg, Properties data) {
>
>                    this.err = err;
>
>                    this.msg = msg;
>
>                    this.data = data;
>
>          }
>
>
>
>
>
>          public TestResponse(int err, String msg){
>
>                    this(err,msg,null);
>
>          }
>
>
>
>
>
>          public Properties getData() {
>
>                    return data;
>
>          }
>
>
>
>
>
>          public void setData(Properties data) {
>
>                    this.data = data;
>
>          }
>
>
>
>
>
>          public int getErr() {
>
>                    return err;
>
>          }
>
>
>
>
>
>          public String getMsg() {
>
>                    return msg;
>
>          }
>
>
>
>
>
>
>
>          public String toString() {
>
>                    StringBuffer buff= new StringBuffer();
>
>                    buff.append( "{[TestResponse]" );
>
>                    buff.append("[response err:" + err + "]");
>
>                    buff.append("[response msg:" + msg + "]");
>
>                    buff.append("[response data:");
>
>                    if( data!=null ){
>
>                             buff.append( data );
>
>                    }
>
>                    buff.append("]");
>
>
>
>
>
>                    buff.append("}");
>
>                    return buff.toString();
>
>
>
>
>
>
>
>          }
>
>
>
> }
>
>
>
> --------------------------------Client:-----------------------------------
>
> TestSign:
>
>
>
> package test.thread;
>
>
>
> import java.io.ByteArrayInputStream;
>
> import java.io.FileInputStream;
>
> import java.io.FileOutputStream;
>
> import java.io.PrintWriter;
>
> import java.security.KeyStore;
>
> import java.security.PrivateKey;
>
> import java.security.Security;
>
> import java.util.Enumeration;
>
>
>
> //import cn.com.infosec.jce.provider.InfosecProvider;
>
>
>
> /*
>
>  * Created on 2005-10-18
>
>  *
>
>  * TODO To change the template for this generated file go to
>
>  * Window - Preferences - Java - Code Style - Code Templates
>
>  */
>
>
>
> /**
>
>  * @author lixiangfeng
>
>  *
>
>  * TODO To change the template for this generated type comment go to
>
>  * Window - Preferences - Java - Code Style - Code Templates
>
>  */
>
> public class TestSign {
>
>
>
>
>
>          private static int finiCount = 0;
>
>          private static int failCount = 0;
>
>          public static Object synObj = new Object();
>
>          public static Object synObj2 = new Object();
>
>          public static Object synObj3 = new Object();
>
>          public static int threadCount = 0;
>
>          public static void main(String[] args) {
>
>
>
>                    try {
>
>                             int uCount = Integer.parseInt(args[0]);
>
>                             int uTime = Integer.parseInt(args[1]);
>
>
>
>
>
>                             FileOutputStream fos = new FileOutputStream(
> "sign.log" );
>
>                             PrintWriter pr = new PrintWriter( fos );
>
>
>
>                             TestSignThread.init();
>
>
>
>
>
>                             for (int i = 0; i < uCount; i++) {
>
>                                      Thread th = new Thread(new
> TestSignThread( uTime, pr ));
>
>                                      th.start();
>
>                             }
>
>
>
>                             threadCount = uCount;
>
>                             System.out.println("testcount:" +
threadCount);
>
>                             System.out.println( "run time       :" + uTime
+
> "s" );
>
>                             System.out.println("test running,please
> wait...");
>
>                             while( threadCount>0){
>
>                                      Thread.sleep( 1000 );
>
>                             }
>
>
>
>                             System.out.println( "test finish......" );
>
>                             System.out.println( "finish count   :" +
> finiCount );
>
>                             System.out.println( "failed count   :" +
> failCount );
>
>                             System.out.println( "speed:" +
(finiCount/uTime)
> );
>
>
>
>
>
>
>
>                    } catch (Exception e) {
>
>                             e.printStackTrace();
>
>                    }
>
>          }
>
>
>
>
>
>          public static void incSucc(){
>
>                    synchronized(synObj){
>
>                             finiCount++;
>
>                    }
>
>          }
>
>
>
>          public static void incFail(){
>
>                    synchronized(synObj2){
>
>                             failCount++;
>
>                    }
>
>          }
>
>
>
>          public static void stopThread(){
>
>                    synchronized(synObj3){
>
>                             threadCount--;
>
>                    }
>
>          }
>
>
>
>
>
> }
>
>
>
>
>
> TestThread:
>
>
>
> package test.thread;
>
>
>
> import java.io.ByteArrayInputStream;
>
> import java.io.ByteArrayOutputStream;
>
> import java.io.DataInputStream;
>
> import java.io.DataOutputStream;
>
> import java.io.FileInputStream;
>
> import java.io.ObjectOutputStream;
>
> import java.io.PrintWriter;
>
> import java.net.InetSocketAddress;
>
> import java.net.Socket;
>
> import java.security.PrivateKey;
>
> import java.security.Security;
>
> import java.security.Signature;
>
> import java.text.ParseException;
>
> import java.text.SimpleDateFormat;
>
> import java.util.Date;
>
> import java.util.Properties;
>
> import java.util.TimeZone;
>
>
>
> import org.apache.mina.common.ConnectFuture;
>
> import org.apache.mina.common.IoSession;
>
> import org.apache.mina.common.RuntimeIOException;
>
> import org.apache.mina.filter.codec.ProtocolCodecFilter;
>
> import
>
org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
>
> import org.apache.mina.transport.socket.nio.SocketConnector;
>
> import org.apache.mina.transport.socket.nio.SocketConnectorConfig;
>
>
>
> import test.mina.TestRequest;
>
> import test.mina.client.ClientSessionHandler;
>
>
>
> //import Test.TestResult;
>
> //
>
> //import cn.com.infosec.jce.provider.InfosecProvider;
>
> //import cn.com.infosec.netcert.crypto.CryptoHandler;
>
> //import cn.com.infosec.netcert.rads.CertManager;
>
> //import cn.com.infosec.netcert.rads.SysProperty;
>
> //import cn.com.infosec.netcert.rads.exception.CAException;
>
> //import cn.com.infosec.netcert.rads.exception.RAException;
>
> //import cn.com.infosec.netcert.resource.PropertiesKeysRes;
>
>
>
> /*
>
>  * Created on 2005-10-18
>
>  *
>
>  * TODO To change the template for this generated file go to
>
>  * Window - Preferences - Java - Code Style - Code Templates
>
>  */
>
>
>
> /**
>
>  * @author lixiangfeng
>
>  *
>
>  * TODO To change the template for this generated type comment go to
>
>  * Window - Preferences - Java - Code Style - Code Templates
>
>  */
>
> public class TestSignThread implements Runnable {
>
>
>
>
>
>          public long endTime = System.currentTimeMillis();
>
>          //public PrivateKey prik = null;
>
>          public PrintWriter pr = null;
>
>          public TestSignThread( int time, PrintWriter pr ){
>
>                    endTime += time * 1000;
>
>                    //this.prik = prik;
>
>                    this.pr = pr;
>
>          }
>
>
>
>          private static String basedn = "o=infosec";
>
>          private static String template = "EE_SIGNING";
>
>
>
>
>
>          public static void init() throws Exception{
>
>
>
>
>
>          }
>
>
>
>          public void run() {
>
>
>
>         SocketConnectorConfig cfg = new SocketConnectorConfig();
>
>         cfg.setConnectTimeout(30);
>
>         cfg.getSessionConfig().setSoLinger(0);
>
>
>
>             cfg.getFilterChain().addLast(
>
>                     "codec",
>
>                     new ProtocolCodecFilter(
>
>                             new ObjectSerializationCodecFactory()));
>
>
>
>
>                    while( true ){
>
>                             if(endTime < System.currentTimeMillis() ){
>
>                                      TestSign.stopThread();
>
>                                      break;
>
>                             }
>
>
>
>
>
>
>
>                                     SocketConnector connector = new
> SocketConnector();
>
>                                     connector.setWorkerTimeout(1);
>
>
>
>                                     IoSession session=null;
>
>                                         try {
>
>                                             ConnectFuture future =
> connector.connect(new InetSocketAddress(
>
>                                                     "192.168.0.111",
8282),
> new ClientSessionHandler(), cfg);
>
>
>
>                                             future.join();
>
>                                             session = future.getSession();
>
>
session.getCloseFuture().join();
>
>                                             TestSign.incSucc();
>
>                                             //break;
>
>                                         } catch (Exception e) {
>
>                                             e.printStackTrace( pr );
>
>                                             TestSign.incFail();
>
>                                         }
>
>
>
>
>
>
>
>
>
>                    }
>
>
>
>          }
>
>
>
> }
>
>
>
> ClientHandler:
>
>
>
> /*
>
>  *  Licensed to the Apache Software Foundation (ASF) under one
>
>  *  or more contributor license agreements.  See the NOTICE file
>
>  *  distributed with this work for additional information
>
>  *  regarding copyright ownership.  The ASF licenses this file
>
>  *  to you under the Apache License, Version 2.0 (the
>
>  *  "License"); you may not use this file except in compliance
>
>  *  with the License.  You may obtain a copy of the License at
>
>  *
>
>  *    http://www.apache.org/licenses/LICENSE-2.0
>
>  *
>
>  *  Unless required by applicable law or agreed to in writing,
>
>  *  software distributed under the License is distributed on an
>
>  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>
>  *  KIND, either express or implied.  See the License for the
>
>  *  specific language governing permissions and limitations
>
>  *  under the License.
>
>  *
>
>  */
>
> package test.mina.client;
>
>
>
> import java.util.Properties;
>
>
>
> import org.apache.mina.common.IoHandler;
>
> import org.apache.mina.common.IoHandlerAdapter;
>
> import org.apache.mina.common.IoSession;
>
> import org.apache.mina.transport.socket.nio.SocketSessionConfig;
>
>
>
> import test.mina.TestRequest;
>
> import test.mina.TestResponse;
>
>
>
> /**
>
>  * {@link IoHandler} for SumUp client.
>
>  *
>
>  * @author The Apache Directory Project (mina-dev@directory.apache.org)
>
>  * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (�?, 13  7
�?
> 2007) $
>
>  */
>
> public class ClientSessionHandler extends IoHandlerAdapter {
>
>     //private final int[] values;
>
>
>
>     private boolean finished;
>
>
>
>
>
>     public boolean isFinished() {
>
>         return finished;
>
>     }
>
>
>
>     public void sessionOpened(IoSession session) {
>
>
>
> //             System.out.println( "Thread" + Thread.currentThread() +  "
> start at:" + System.currentTimeMillis()   );
>
> //             SocketSessionConfig config = session.getConfig();
>
> //             config.
>
>     //System.out.println( session.getConfig()   );
>
>     SocketSessionConfig config = (SocketSessionConfig)session.getConfig();
>
>     config.setSoLinger(0);
>
>     TestRequest req = new TestRequest("TESTMINA");
>
>     Properties p1 = new Properties();
>
>     p1.setProperty("CARDSN","1111000000000068993");
>
>     req.setData(p1);
>
>     session.write(req);
>
>
>
>
>
>     }
>
>
>
>     public void messageReceived(IoSession session, Object message) {
>
>         // server only sends ResultMessage. otherwise, we will have to
> identify
>
>         // its type using instanceof operator.
>
>         TestResponse res = (TestResponse)message;
>
> //        System.out.println( res );
>
>
>
>         session.close();
>
>     finished = true;
>
> //             System.out.println( "Thread" + Thread.currentThread() +  "
> finish at:" + System.currentTimeMillis()   );
>
>
>
>     }
>
>
>
>     public void exceptionCaught(IoSession session, Throwable cause) {
>
>         session.close();
>
>     }
>
> }
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


-- 
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP Key ID: 0x0255ECA6


Re: Mina Performance

Posted by Trustin Lee <tr...@gmail.com>.
Hi,

Could you zip the source code files and attach to our support forum?

Thanks,
Trustin

On 9/18/07, ����� <li...@infosec.com.cn> wrote:
> Hello, I Write a Server Demo use Mina-1.1.2,use the
> ObjectSerializationCodecFactory. But When Run This Server,Use a 100 threads
> Client to test it's performance,it's performance is poor. Server machine
> is  2CPU *2.8G,1G memory ,Suse Linux  9. It Tran/sec only 60~80. I past the
> code under, who can help me?
>
>
>
> Then,I Run the HttpServer exsample  from Mina1.1.2 in same machine, I use
> the apche ab test it.When I use apace ab in 50 concurrency,it performance
> Trans/Sec is 4800,but when I use 100 or more concurrency,it performance is
> very poor, only 100~200 trans/sec. I cannot understand it ,who can tell me
> why?
>
>
>
> -------------------------------------------Server:--------------------------
> -----------------------
>
>
>
> Main.java
>
>
>
> /*
>
>  *  Licensed to the Apache Software Foundation (ASF) under one
>
>  *  or more contributor license agreements.  See the NOTICE file
>
>  *  distributed with this work for additional information
>
>  *  regarding copyright ownership.  The ASF licenses this file
>
>  *  to you under the Apache License, Version 2.0 (the
>
>  *  "License"); you may not use this file except in compliance
>
>  *  with the License.  You may obtain a copy of the License at
>
>  *
>
>  *    http://www.apache.org/licenses/LICENSE-2.0
>
>  *
>
>  *  Unless required by applicable law or agreed to in writing,
>
>  *  software distributed under the License is distributed on an
>
>  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>
>  *  KIND, either express or implied.  See the License for the
>
>  *  specific language governing permissions and limitations
>
>  *  under the License.
>
>  *
>
>  */
>
> package test.mina.server;
>
>
>
> import java.net.InetSocketAddress;
>
> import java.util.concurrent.Executors;
>
>
>
> import org.apache.mina.common.DefaultIoFilterChainBuilder;
>
> import org.apache.mina.common.IoAcceptor;
>
> import org.apache.mina.filter.LoggingFilter;
>
> import org.apache.mina.filter.codec.ProtocolCodecFilter;
>
> import
> org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
>
> import org.apache.mina.filter.executor.ExecutorFilter;
>
> import org.apache.mina.transport.socket.nio.SocketAcceptor;
>
> import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
>
>
>
> /**
>
>  * (<b>Entry point</b>) Echo server
>
>  *
>
>  * @author The Apache Directory Project (mina-dev@directory.apache.org)
>
>  * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (�?, 13  7�?
> 2007) $
>
>  */
>
> public class Main {
>
>     /** Choose your favorite port number. */
>
>     private static final int PORT = 8282;
>
>
>
>     /** Set this to true if you want to make the server SSL */
>
>     private static final boolean USE_SSL = false;
>
>
>
>     public static void main(String[] args) throws Exception {
>
> //        IoAcceptor acceptor = new SocketAcceptor();
>
>         //IoAcceptorConfig config = new SocketAcceptorConfig();
>
>         IoAcceptor acceptor = new SocketAcceptor(4,
> Executors.newCachedThreadPool());
>
>         SocketAcceptorConfig config = new SocketAcceptorConfig();
>
>
>
> //        config.setReuseAddress(true);
>
>         config.setBacklog(30);
>
>
>
> //        Storager.create();
>
> //        config.getFilterChain().addLast(
>
> //                "protocolFilter",
>
> //                new ProtocolCodecFilter(
>
> //                             new TestProtocolCodecFactory(false)));
>
>
>
>       config.getFilterChain().addLast(
>
>       "protocolFilter",
>
>       new ProtocolCodecFilter(
>
>               new ObjectSerializationCodecFactory()));
>
>
>
>
>
>
>
>         DefaultIoFilterChainBuilder chain = config.getFilterChain();
>
>
>
>         chain.addLast("threadPool", new
> ExecutorFilter(Executors.newCachedThreadPool()) );
>
>
>
> //        addLogger(chain);
>
>
>
>         // Bind
>
>         acceptor.bind(new InetSocketAddress(PORT), new
> EchoProtocolHandler(),
>
>                 config);
>
>
>
>         System.out.println("Listening on port " + PORT);
>
>     }
>
>
>
>
>
>
>
>     private static void addLogger(DefaultIoFilterChainBuilder chain)
>
>             throws Exception {
>
>         chain.addLast("logger", new LoggingFilter());
>
>         System.out.println("Logging ON");
>
>     }
>
> }
>
>
>
> Handler:
>
>
>
> /*
>
>  *  Licensed to the Apache Software Foundation (ASF) under one
>
>  *  or more contributor license agreements.  See the NOTICE file
>
>  *  distributed with this work for additional information
>
>  *  regarding copyright ownership.  The ASF licenses this file
>
>  *  to you under the Apache License, Version 2.0 (the
>
>  *  "License"); you may not use this file except in compliance
>
>  *  with the License.  You may obtain a copy of the License at
>
>  *
>
>  *    http://www.apache.org/licenses/LICENSE-2.0
>
>  *
>
>  *  Unless required by applicable law or agreed to in writing,
>
>  *  software distributed under the License is distributed on an
>
>  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>
>  *  KIND, either express or implied.  See the License for the
>
>  *  specific language governing permissions and limitations
>
>  *  under the License.
>
>  *
>
>  */
>
> package test.mina.server;
>
>
>
> import java.util.Properties;
>
>
>
> import org.apache.mina.common.ByteBuffer;
>
> import org.apache.mina.common.IdleStatus;
>
> import org.apache.mina.common.IoHandler;
>
> import org.apache.mina.common.IoHandlerAdapter;
>
> import org.apache.mina.common.IoSession;
>
> import org.apache.mina.common.TransportType;
>
>
>
> import org.apache.mina.transport.socket.nio.SocketSessionConfig;
>
> import org.slf4j.Logger;
>
> import org.slf4j.LoggerFactory;
>
>
>
> import test.mina.TestRequest;
>
> import test.mina.TestResponse;
>
>
>
> public class EchoProtocolHandler extends IoHandlerAdapter {
>
>     private static final Logger log = LoggerFactory
>
>             .getLogger(EchoProtocolHandler.class);
>
>
>
>     public void sessionCreated(IoSession session) {
>
>         if (session.getTransportType() == TransportType.SOCKET) {
>
>            SocketSessionConfig config = (SocketSessionConfig)
> session.getConfig();
>
>
>
>              config.setReceiveBufferSize(2048);
>
>              config.setSoLinger(0);
>
>         }
>
>
>
>         session.setIdleTime(IdleStatus.BOTH_IDLE, 10);
>
>
>
>     }
>
>
>
>     public void sessionIdle(IoSession session, IdleStatus status) {
>
>         log.info("*** IDLE #" + session.getIdleCount(IdleStatus.BOTH_IDLE)
>
>                 + " ***");
>
>     }
>
>
>
>     public void exceptionCaught(IoSession session, Throwable cause) {
>
> //        cause.printStackTrace();
>
>         session.close();
>
>     }
>
>
>
>     public void messageReceived(IoSession session, Object message)
>
>             throws Exception {
>
>
>
>
>
>     TestRequest req = (TestRequest)message;
>
>     Processor p = new TESTProcessor();
>
>
>
>         TestResponse res = new TestResponse(0,"OK");// p.process( req );
>
>         session.write(res);
>
>
>
>         session.close();
>
>
>
>     }
>
> }
>
>
>
> TestRequest:
>
> package test.mina;
>
>
>
>
>
> import java.io.Serializable;
>
> import java.util.Enumeration;
>
> import java.util.Properties;
>
>
>
> public class TestRequest implements Serializable {
>
>
>
>          private String type;
>
>          private Properties data;
>
>
>
>          /**
>
>           * @param type
>
>           */
>
>          public TestRequest(String type) {
>
>                    this.type = type;
>
>          }
>
>
>
>          /**
>
>           * @param type
>
>           * @param data
>
>           */
>
>          public TestRequest(String type, Properties data) {
>
>                    this.type = type;
>
>                    this.data = data;
>
>          }
>
>
>
>          public Properties getData() {
>
>                    return data;
>
>          }
>
>
>
>          public void setData(Properties data) {
>
>                    this.data = data;
>
>          }
>
>
>
>          public String getType() {
>
>                    return type;
>
>          }
>
>
>
>          public void setKeyValue(String key,String value){
>
>                    if(data == null)
>
>                             data = new Properties();
>
>                    data.setProperty( key,value  );
>
>          }
>
>
>
>          public String getKeyValue(String key){
>
>                    if(data==null)return null;
>
>                    return data.getProperty(key);
>
>
>
>          }
>
>
>
>          @Override
>
>          public String toString() {
>
>                    StringBuffer buff= new StringBuffer();
>
>                    buff.append( "{[TestRequest]" );
>
>                    buff.append("[request type:" + type + "]");
>
>                    buff.append("[request data:");
>
>                    if( data!=null ){
>
>                             buff.append( data );
>
>                    }
>
>                    buff.append("]");
>
>
>
>                    buff.append("}");
>
>                    return buff.toString();
>
>
>
>
>
>
>
>          }
>
>
>
>
>
>
>
>
>
> }
>
>
>
> TestResponse:
>
>
>
> package test.mina;
>
>
>
> import java.io.Serializable;
>
> import java.util.Properties;
>
>
>
> public class TestResponse implements Serializable {
>
>
>
>          private int err=0;
>
>          private String msg = "OK";
>
>
>
>          private Properties data;
>
>
>
>          public TestResponse(int err, String msg, Properties data) {
>
>                    this.err = err;
>
>                    this.msg = msg;
>
>                    this.data = data;
>
>          }
>
>
>
>
>
>          public TestResponse(int err, String msg){
>
>                    this(err,msg,null);
>
>          }
>
>
>
>
>
>          public Properties getData() {
>
>                    return data;
>
>          }
>
>
>
>
>
>          public void setData(Properties data) {
>
>                    this.data = data;
>
>          }
>
>
>
>
>
>          public int getErr() {
>
>                    return err;
>
>          }
>
>
>
>
>
>          public String getMsg() {
>
>                    return msg;
>
>          }
>
>
>
>
>
>
>
>          public String toString() {
>
>                    StringBuffer buff= new StringBuffer();
>
>                    buff.append( "{[TestResponse]" );
>
>                    buff.append("[response err:" + err + "]");
>
>                    buff.append("[response msg:" + msg + "]");
>
>                    buff.append("[response data:");
>
>                    if( data!=null ){
>
>                             buff.append( data );
>
>                    }
>
>                    buff.append("]");
>
>
>
>
>
>                    buff.append("}");
>
>                    return buff.toString();
>
>
>
>
>
>
>
>          }
>
>
>
> }
>
>
>
> --------------------------------Client:-----------------------------------
>
> TestSign:
>
>
>
> package test.thread;
>
>
>
> import java.io.ByteArrayInputStream;
>
> import java.io.FileInputStream;
>
> import java.io.FileOutputStream;
>
> import java.io.PrintWriter;
>
> import java.security.KeyStore;
>
> import java.security.PrivateKey;
>
> import java.security.Security;
>
> import java.util.Enumeration;
>
>
>
> //import cn.com.infosec.jce.provider.InfosecProvider;
>
>
>
> /*
>
>  * Created on 2005-10-18
>
>  *
>
>  * TODO To change the template for this generated file go to
>
>  * Window - Preferences - Java - Code Style - Code Templates
>
>  */
>
>
>
> /**
>
>  * @author lixiangfeng
>
>  *
>
>  * TODO To change the template for this generated type comment go to
>
>  * Window - Preferences - Java - Code Style - Code Templates
>
>  */
>
> public class TestSign {
>
>
>
>
>
>          private static int finiCount = 0;
>
>          private static int failCount = 0;
>
>          public static Object synObj = new Object();
>
>          public static Object synObj2 = new Object();
>
>          public static Object synObj3 = new Object();
>
>          public static int threadCount = 0;
>
>          public static void main(String[] args) {
>
>
>
>                    try {
>
>                             int uCount = Integer.parseInt(args[0]);
>
>                             int uTime = Integer.parseInt(args[1]);
>
>
>
>
>
>                             FileOutputStream fos = new FileOutputStream(
> "sign.log" );
>
>                             PrintWriter pr = new PrintWriter( fos );
>
>
>
>                             TestSignThread.init();
>
>
>
>
>
>                             for (int i = 0; i < uCount; i++) {
>
>                                      Thread th = new Thread(new
> TestSignThread( uTime, pr ));
>
>                                      th.start();
>
>                             }
>
>
>
>                             threadCount = uCount;
>
>                             System.out.println("testcount:" + threadCount);
>
>                             System.out.println( "run time       :" + uTime +
> "s" );
>
>                             System.out.println("test running,please
> wait...");
>
>                             while( threadCount>0){
>
>                                      Thread.sleep( 1000 );
>
>                             }
>
>
>
>                             System.out.println( "test finish......" );
>
>                             System.out.println( "finish count   :" +
> finiCount );
>
>                             System.out.println( "failed count   :" +
> failCount );
>
>                             System.out.println( "speed:" + (finiCount/uTime)
> );
>
>
>
>
>
>
>
>                    } catch (Exception e) {
>
>                             e.printStackTrace();
>
>                    }
>
>          }
>
>
>
>
>
>          public static void incSucc(){
>
>                    synchronized(synObj){
>
>                             finiCount++;
>
>                    }
>
>          }
>
>
>
>          public static void incFail(){
>
>                    synchronized(synObj2){
>
>                             failCount++;
>
>                    }
>
>          }
>
>
>
>          public static void stopThread(){
>
>                    synchronized(synObj3){
>
>                             threadCount--;
>
>                    }
>
>          }
>
>
>
>
>
> }
>
>
>
>
>
> TestThread:
>
>
>
> package test.thread;
>
>
>
> import java.io.ByteArrayInputStream;
>
> import java.io.ByteArrayOutputStream;
>
> import java.io.DataInputStream;
>
> import java.io.DataOutputStream;
>
> import java.io.FileInputStream;
>
> import java.io.ObjectOutputStream;
>
> import java.io.PrintWriter;
>
> import java.net.InetSocketAddress;
>
> import java.net.Socket;
>
> import java.security.PrivateKey;
>
> import java.security.Security;
>
> import java.security.Signature;
>
> import java.text.ParseException;
>
> import java.text.SimpleDateFormat;
>
> import java.util.Date;
>
> import java.util.Properties;
>
> import java.util.TimeZone;
>
>
>
> import org.apache.mina.common.ConnectFuture;
>
> import org.apache.mina.common.IoSession;
>
> import org.apache.mina.common.RuntimeIOException;
>
> import org.apache.mina.filter.codec.ProtocolCodecFilter;
>
> import
> org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
>
> import org.apache.mina.transport.socket.nio.SocketConnector;
>
> import org.apache.mina.transport.socket.nio.SocketConnectorConfig;
>
>
>
> import test.mina.TestRequest;
>
> import test.mina.client.ClientSessionHandler;
>
>
>
> //import Test.TestResult;
>
> //
>
> //import cn.com.infosec.jce.provider.InfosecProvider;
>
> //import cn.com.infosec.netcert.crypto.CryptoHandler;
>
> //import cn.com.infosec.netcert.rads.CertManager;
>
> //import cn.com.infosec.netcert.rads.SysProperty;
>
> //import cn.com.infosec.netcert.rads.exception.CAException;
>
> //import cn.com.infosec.netcert.rads.exception.RAException;
>
> //import cn.com.infosec.netcert.resource.PropertiesKeysRes;
>
>
>
> /*
>
>  * Created on 2005-10-18
>
>  *
>
>  * TODO To change the template for this generated file go to
>
>  * Window - Preferences - Java - Code Style - Code Templates
>
>  */
>
>
>
> /**
>
>  * @author lixiangfeng
>
>  *
>
>  * TODO To change the template for this generated type comment go to
>
>  * Window - Preferences - Java - Code Style - Code Templates
>
>  */
>
> public class TestSignThread implements Runnable {
>
>
>
>
>
>          public long endTime = System.currentTimeMillis();
>
>          //public PrivateKey prik = null;
>
>          public PrintWriter pr = null;
>
>          public TestSignThread( int time, PrintWriter pr ){
>
>                    endTime += time * 1000;
>
>                    //this.prik = prik;
>
>                    this.pr = pr;
>
>          }
>
>
>
>          private static String basedn = "o=infosec";
>
>          private static String template = "EE_SIGNING";
>
>
>
>
>
>          public static void init() throws Exception{
>
>
>
>
>
>          }
>
>
>
>          public void run() {
>
>
>
>         SocketConnectorConfig cfg = new SocketConnectorConfig();
>
>         cfg.setConnectTimeout(30);
>
>         cfg.getSessionConfig().setSoLinger(0);
>
>
>
>             cfg.getFilterChain().addLast(
>
>                     "codec",
>
>                     new ProtocolCodecFilter(
>
>                             new ObjectSerializationCodecFactory()));
>
>
>
>
>                    while( true ){
>
>                             if(endTime < System.currentTimeMillis() ){
>
>                                      TestSign.stopThread();
>
>                                      break;
>
>                             }
>
>
>
>
>
>
>
>                                     SocketConnector connector = new
> SocketConnector();
>
>                                     connector.setWorkerTimeout(1);
>
>
>
>                                     IoSession session=null;
>
>                                         try {
>
>                                             ConnectFuture future =
> connector.connect(new InetSocketAddress(
>
>                                                     "192.168.0.111", 8282),
> new ClientSessionHandler(), cfg);
>
>
>
>                                             future.join();
>
>                                             session = future.getSession();
>
>                                             session.getCloseFuture().join();
>
>                                             TestSign.incSucc();
>
>                                             //break;
>
>                                         } catch (Exception e) {
>
>                                             e.printStackTrace( pr );
>
>                                             TestSign.incFail();
>
>                                         }
>
>
>
>
>
>
>
>
>
>                    }
>
>
>
>          }
>
>
>
> }
>
>
>
> ClientHandler:
>
>
>
> /*
>
>  *  Licensed to the Apache Software Foundation (ASF) under one
>
>  *  or more contributor license agreements.  See the NOTICE file
>
>  *  distributed with this work for additional information
>
>  *  regarding copyright ownership.  The ASF licenses this file
>
>  *  to you under the Apache License, Version 2.0 (the
>
>  *  "License"); you may not use this file except in compliance
>
>  *  with the License.  You may obtain a copy of the License at
>
>  *
>
>  *    http://www.apache.org/licenses/LICENSE-2.0
>
>  *
>
>  *  Unless required by applicable law or agreed to in writing,
>
>  *  software distributed under the License is distributed on an
>
>  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>
>  *  KIND, either express or implied.  See the License for the
>
>  *  specific language governing permissions and limitations
>
>  *  under the License.
>
>  *
>
>  */
>
> package test.mina.client;
>
>
>
> import java.util.Properties;
>
>
>
> import org.apache.mina.common.IoHandler;
>
> import org.apache.mina.common.IoHandlerAdapter;
>
> import org.apache.mina.common.IoSession;
>
> import org.apache.mina.transport.socket.nio.SocketSessionConfig;
>
>
>
> import test.mina.TestRequest;
>
> import test.mina.TestResponse;
>
>
>
> /**
>
>  * {@link IoHandler} for SumUp client.
>
>  *
>
>  * @author The Apache Directory Project (mina-dev@directory.apache.org)
>
>  * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (�?, 13  7�?
> 2007) $
>
>  */
>
> public class ClientSessionHandler extends IoHandlerAdapter {
>
>     //private final int[] values;
>
>
>
>     private boolean finished;
>
>
>
>
>
>     public boolean isFinished() {
>
>         return finished;
>
>     }
>
>
>
>     public void sessionOpened(IoSession session) {
>
>
>
> //             System.out.println( "Thread" + Thread.currentThread() +  "
> start at:" + System.currentTimeMillis()   );
>
> //             SocketSessionConfig config = session.getConfig();
>
> //             config.
>
>     //System.out.println( session.getConfig()   );
>
>     SocketSessionConfig config = (SocketSessionConfig)session.getConfig();
>
>     config.setSoLinger(0);
>
>     TestRequest req = new TestRequest("TESTMINA");
>
>     Properties p1 = new Properties();
>
>     p1.setProperty("CARDSN","1111000000000068993");
>
>     req.setData(p1);
>
>     session.write(req);
>
>
>
>
>
>     }
>
>
>
>     public void messageReceived(IoSession session, Object message) {
>
>         // server only sends ResultMessage. otherwise, we will have to
> identify
>
>         // its type using instanceof operator.
>
>         TestResponse res = (TestResponse)message;
>
> //        System.out.println( res );
>
>
>
>         session.close();
>
>     finished = true;
>
> //             System.out.println( "Thread" + Thread.currentThread() +  "
> finish at:" + System.currentTimeMillis()   );
>
>
>
>     }
>
>
>
>     public void exceptionCaught(IoSession session, Throwable cause) {
>
>         session.close();
>
>     }
>
> }
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


-- 
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP Key ID: 0x0255ECA6