一直知道MINA是apache 开发的一个开发socket编程框架,但一直没弄清楚MINA2.0里的多线程该如何处理,根据apache提供的文档,使用MINA2.0开发多线程的程序变的非常简单,只用在其filter中加入线程池就可以了,感觉挺神奇,于是参考apache的其他项目,写了个小例子,下面是代码,作为自己以后学习使用。
public class MinaServerTest {
private SocketAcceptor acceptor;
private ExecutorService filterExecutor = new OrderedThreadPoolExecutor();//apache 提供的线程池,有参数可以设置,但不知道设置什么时候比较好,就用了默认的,从参数的设置上看,(因为没看源码,我自己猜测)其应该是使用的jdk的线程池
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MinaServerTest mst=new MinaServerTest();
mst.start();
}
public synchronized void start(){
acceptor = new NioSocketAcceptor(Runtime.getRuntime()
.availableProcessors());
acceptor.setReuseAddress(true);
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,
10);
// Decrease the default receiver buffer size
((SocketSessionConfig) acceptor.getSessionConfig())
.setReceiveBufferSize(512);
MdcInjectionFilter mdcFilter = new MdcInjectionFilter();
acceptor.getFilterChain().addLast("mdcFilter", mdcFilter);
acceptor.getFilterChain().addLast("threadPool",
new ExecutorFilter(filterExecutor));//设置线程池,以支持多线程
acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName("UTF-8"))));//协议
acceptor.getFilterChain().addLast("mdcFilter2", mdcFilter);
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.setHandler(new YourHandler());//你自己的处理类
try{
acceptor.bind((new InetSocketAddress(8080)));
}catch(IOException e){
e.printStackTrace();
}
}
}
handler我没有实现,这里只是举个小例子,handler需要根据业务自己编写相应的函数就好了
public class YourHandler implements IoHandler{
public void sessionCreated(IoSession session) throws Exception
{
;//会话创建
}
public void sessionOpened(IoSession session) throws Exception{
;//打开会话,与sessionCreated最大的区别是它是从另一个线程处调用的
}
public void sessionClosed(IoSession session) throws Exception{
;//会话结束,当连接关闭时被调用
}
public void sessionIdle(IoSession session, IdleStatus status) throws Exception{
;//会话空闲
}
public void exceptionCaught(IoSession session, Throwable cause) throws Exception{
;//异常捕获,Mina会自动关闭此连接
}
public void messageReceived(IoSession session, Object message) throws Exception{
;//接收到消息
}
public void messageSent(IoSession session, Object message) throws Exception{
;//发送消息
}
}