mina框架是什么意思(个人年度总结框架)

参考:http://xinsync.xju.edu.cn/index.php/archives/category/prglang/java/mina简单介绍:MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度,封装了很多底层的细节,然开发者把精力集中到业务逻辑上来,最近做了一个相关的项目,为了备忘对MINA做一个总结。下面这个start方法用来初始化MINA:priv…

大家好,又见面了,我是你们的朋友全栈君。

参考:http://xinsync.xju.edu.cn/index.php/archives/category/prglang/java/mina

简单介绍:MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度,封装了很多底层的细节,然开发者把精力集中到业务逻辑上来,最近做了一个相关的项目,为了备忘对MINA做一个总结。

下面这个start方法用来初始化MINA:

private void start(int port, WebContext ctx) 
      throws IOException, InstantiationException
        , IllegalAccessException, ClassNotFoundException {
	//初始化Acceptor
	NioSocketAcceptor acceptor = new NioSocketAcceptor(5);
		
       java.util.concurrent.Executor threadPool = Executors.newFixedThreadPool(1500);//建立线程池
       //加入过滤器(Filter)到Acceptor
       acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool));
acceptor.getFilterChain().addLast("codec", 
       new ProtocolCodecFilter(new WebDecoder(),new WebEncoder()));
       LoggingFilter filter = new LoggingFilter();
	filter.setExceptionCaughtLogLevel(LogLevel.DEBUG);
	filter.setMessageReceivedLogLevel(LogLevel.DEBUG);
	filter.setMessageSentLogLevel(LogLevel.DEBUG);
	filter.setSessionClosedLogLevel(LogLevel.DEBUG);
	filter.setSessionCreatedLogLevel(LogLevel.DEBUG);
	filter.setSessionIdleLogLevel(LogLevel.DEBUG);
	filter.setSessionOpenedLogLevel(LogLevel.DEBUG);
	acceptor.getFilterChain().addLast("logger", filter); 
        
       acceptor.setReuseAddress(true);//设置的是主服务监听的端口可以重用
        
       acceptor.getSessionConfig().setReuseAddress(true);//设置每一个非主监听连接的端口可以重用
       acceptor.getSessionConfig().setReceiveBufferSize(1024);//设置输入缓冲区的大小
       acceptor.getSessionConfig().setSendBufferSize(10240);//设置输出缓冲区的大小
//设置为非延迟发送,为true则不组装成大包发送,收到东西马上发出
       acceptor.getSessionConfig().setTcpNoDelay(true);
//设置主服务监听端口的监听队列的最大值为100,如果当前已经有100个连接,再新的连接来将被服务器拒绝
       acceptor.setBacklog(100);
       acceptor.setDefaultLocalAddress(new InetSocketAddress(port));
       //加入处理器(Handler)到Acceptor
       acceptor.setHandler(new WebHandler());
	acceptor.bind();
}

 NioSocketAcceptor是MINA的适配器,一切都是从这里开始的。MINA中有个过滤器和处理器的概念,过滤器用来过滤数据,处理器用来处理数据。具体来说MINA的处理模型就是request->过滤器A->过滤器B->处理器->过滤器B->过滤器A->response,这里的request和response类似serlvet的request和response。

acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool));
//加入一个线程池到适配器,这里用的是jdk自带的线程池

 

 acceptor.getFilterChain().addLast("codec", 
        new ProtocolCodecFilter(new WebDecoder(),new WebEncoder()));
//这里是处理逻辑的关键部位,请求的处理都是在WebDecoder类和WebEncoder类中处理,可以明显从命名上看出来一个是用来解码,另一个是用来编码,requet过来后先进入WebDecoder类(实现了ProtocolDecoder接口)进行解码处理,这里可以加入自己的逻辑把传进来的流解码成自己需要的信息。而WebEncoder类(实现了ProtocolEncoder接口)是进行编码,在这个类里面加入自己的逻辑把处理后的信息组装发送给客户端(response)。而在解码和编码过程中WebHandler(扩展了IoHandlerAdapter抽象类)起到了处理器的作用。
//request->WebDecoder->WebHandler->WebEncode->response

 

现在详细描述一下request->WebDecoder->WebHandler->WebEncode->response的过程:

客户端发送一个请求到MINA服务器,这里相当于来了一个requet。请求首先来到

WebDecoder类(实现了ProtocolDecoder接口)中的 
boolean decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception{}方法
/*
参数in:用户请求信息全存在这里,读数据就从in这里读。
参数out:用来输出处理后的数据到Filter的下一个过滤器,如果没有过滤器了就输出到WebHandler,这里有点和
servelt的过滤器类似。利用out.write(Object object);这个函数可以把数据传到下一个Filter。我们可以自己定义
一个对象,我们假设为Request,用它来传递消息,那末这里就可以写成out.write(new RequsetMessage());
如果这个方法返回false,就是说当前逻辑包还没接收完(也就是当前的IoBuffer并没有包含足够的数据),需要再次
执行decode方法(再次获取新的IoBuffer),用来获取足够的数据。如果返回值为true就表示可以不执行decode方
法了,但是要激活handler方法,必须要调用out.write方法。
public class RequestMessage{}//这里什么也不做
*/

 然后到

WebHandler(扩展了IoHandlerAdapter抽象类)中的
void messageReceived(IoSession session, Object message) throws Exception{}方法
WriteFuture future = session.write(response);//session中必须加入这个代码,才会激活encode方法
future.addListener(IoFutureListener.CLOSE);//这个的作用是发送完毕后关闭连接,加了就是短连接,不然是长连接
IoFutureListener里面有个operationComplete(IoFuture future)方法,当流发送完成之后才调用这个方法。
/*
参数message:用来获取Filter传递过来的对象.对应代码RequestMessage request = (RequestMessage) message;
参数session:用来发送数据到Filter.对应代码session.write(new ResponseMessage());
public class ResponseMessage{}//这里什么也不做,假设存放处理后的数据
注意:对于一个MINA程序而言,对于WebHandler类只生成一个对象,所以要考虑线程安全问题
 */

 

然后到

WebEncoder类(实现了ProtocolEncoder接口)中的
boolean encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception{} 
方法
/*
参数message:用来获取上一个Filter节点的数据或者处理器的数据(如果这个过滤器为最靠近处理器的那个)
ResponseMessage response = (ResponseMessage)message;
参数out:用来输出数据到下一个Filter节点过或者到客户端,用out.write(Object encodedMessage)把数据发送
出去,但是要注意的是,如果这个Filter下一个节点如果是客户端的话,那个这个encodedMessage数据必须为
IoBuffer类型的,可以利用IoBuffer.wrap(byte[] byteArray)这个方法来格式化输出数据
*/

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127387.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • FabricJS gotchas/FabricJS陷阱[通俗易懂]

    FabricJS gotchas/FabricJS陷阱[通俗易懂]FabricJSgotchas这个页面包含了第一次接触fabricJS的人打开的最常见问题的列表。这些缺陷的产生,既有解释不清的原因,也有文档不完善的原因。在这里,我们试图解决共同的问题。Objectsarenomoreselectable-setCoords(对象不再是可选择的-setCoords)Fabric包含两组坐标以快速知道物体在画布上的位置。它们链接到两个对象属性:oCoords和aCoords。当用户与对象交互或结束变换(例如拖动)时,fabricJS会自动更新这些坐标。

    2022年10月24日
  • menuconfig 配置选项详解

    menuconfig 配置选项详解转自:http://www.blog.chinaunix.net/uid-15887868-id-2758315.html在menuconfig中配置:详细介绍内核配置选项及删改情况第一部分:全部删除Codematurityleveloptions—>代码成熟等级选项[]Promptfordevelopmentand/orincompletecode/drivers…

  • Java异常处理习题

    Java异常处理习题一、选择题1、java中用来抛出异常的关键字是()A.try     B.catch   C.throw         D.finally 2、关于异常,下列说法正确的是()A.异常是一种对象       B.一旦程序运行,异常将被创建C.为了保证程序运行速度,要尽量避免异常控制     D.以上说法都不对 3、()类是所有异常类的父类。A.Th

  • PTA 浙大版《C语言程序设计实验与习题指导(第3版)》题目集(参考代码)

    PTA 浙大版《C语言程序设计实验与习题指导(第3版)》题目集(参考代码)C语言PTA练习题浙大版《C语言程序设计实验与习题指导(第3版)》题目集寒假在家,想着吧PTA上的C语言练习题写写,博主初学C语言,其中有些代码写的可能有些令人费解甚至是让人笑话,但是这也是一个练习的过程。注:其中有些题的代码参考了其他人。题目号题目名实验1-1HelloWorld!实验1-2WelcometoYou!实验1-3ProgramminginCisfun!实验1-4输出三角形实验1-5输出菱形图案实验1-6输出带

    2022年10月26日
  • C#查询数据库–ExecuteReader方法的使用

    C#查询数据库–ExecuteReader方法的使用在做数据库的查询过程中,使用方法ExecuteReader,其返回结果为MySqlDataReader,由于参考的信息有误,走了好长时间的弯路,记录下来; stringconnectionStr="server=localhost;uid=root;password=;database=db_family";stringsqlContent="select*f…

  • 积分上限函数_定积分的基本计算方法

    积分上限函数_定积分的基本计算方法设函数$f(x)$在区间$[a,b]$上可积,对任意的$x\in[a,b]$,做变上限积分$$\Phi(x)=\int_{a}^{x}f(t)dt$$这个积分称为函数$f(x

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号