MINA框架新人指南
Mina简单的入门示例
Mina简单的⼊门⽰例Mina是Apache下的⼀个⽹络应⽤程序框架,⽤来帮助⽤户简单地开发⾼性能和⾼可扩展性的⽹络应⽤程序。
它提供了⼀个通过Java NIO在不同的传输协议上抽象的事件驱动的异步API,例如TCP/IP和UDP/IP。
还没了解原理之前,我们先从官⽹例⼦改写⼀下,从实践开始。
我记得⼊⾏前有个前辈说过,学习任何新技术,不要先急着了解其原理,先找个例⼦实践⼀下。
我觉得相当正确,因为没有谁在学习⾃⾏车前,是先把⾃⾏车运⾏原理弄清楚的。
依赖:jdk1.7开发环境:ideaIU-14.1.4测试环境:win7建⽴maven⼯程MinaDemo,在pom.xml配置⽂件添加必要的依赖:12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21<?xml version="1.0"encoding="UTF-8"?><project xmlns=""xmlns:xsi=""xsi:schemaLocation=" "><modelVersion>4.0.0</modelVersion><groupId>MinaDemo</groupId><artifactId>MinaDemo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId><version>2.0.9</version></dependency></dependencies></project>TimeServer.java类:12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30package com.mangocool.mina;import java.io.IOException;import .InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.prefixedstring.PrefixedStringCodecFactory;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;/*** Created by MANGOCOOL on 2015/10/20.*/public class TimeServer {private static final int PORT = 9123;public static void main(String[] args) throws IOException{// 创建服务监听器,6是IoProcessor的线程数IoAcceptor acceptor = new NioSocketAcceptor(6);// 增加⽇志过滤器acceptor.getFilterChain().addLast("logger", new LoggingFilter());// 增加编码过滤器,统⼀编码UTF-8acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset.forName("UTF-8")))); // 设置服务端逻辑处理器acceptor.setHandler(new TimeServerHandler());30 31 32 33 34 35 36 37 38 39 acceptor.setHandler(new TimeServerHandler());// 设置读缓存⼤⼩acceptor.getSessionConfig().setReadBufferSize(2048);// 设置指定类型的空闲时间,空闲时间超过这个值将触发sessionIdle⽅法 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 绑定端⼝acceptor.bind(new InetSocketAddress(PORT));}}TimeServerHandler.java类:1234 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56package com.mangocool.mina;import java.util.Date;import org.apache.mina.core.service.IoHandler;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;/*** Created by MANGOCOOL on 2015/10/20.*/public class TimeServerHandler implements IoHandler {@Overridepublic void exceptionCaught(IoSession session, Throwable throwable) throws Exception{throwable.printStackTrace();}@Overridepublic void messageReceived(IoSession session, Object message) throws Exception{String str = message.toString();System.out.println("server端接收到的消息:"+ str);if(str.trim().equalsIgnoreCase("exit")){session.close(true);return;}Date date = new Date();session.write(date.toString());}@Overridepublic void messageSent(IoSession session, Object message) throws Exception{System.out.println("server端发送信息:"+ message.toString());}public void inputClosed(IoSession session) throws Exception{System.out.println("server端:"+ session.getId() + " 关闭输⼊");}@Overridepublic void sessionClosed(IoSession session) throws Exception{System.out.println("server端IP:"+ session.getRemoteAddress().toString() + " 关闭连接"); System.exit(0);}@Overridepublic void sessionCreated(IoSession session) throws Exception{System.out.println("server端IP:"+ session.getRemoteAddress().toString() + " 创建连接"); }@Overridepublic void sessionIdle(IoSession session, IdleStatus status) throws Exception56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 public void sessionIdle(IoSession session, IdleStatus status) throws Exception{System.out.println("server端闲置连接:会话 "+ session.getId() + " 被触发 "+ session.getIdleCount(status) + " 次"); }@Overridepublic void sessionOpened(IoSession session) throws Exception{System.out.println("server端打开连接");}}public void exceptionCaught(IoSession session, Throwable cause) 当接⼝中其他⽅法抛出异常未被捕获时触发此⽅法。
Joomla网站搭建的基本操作指南
Joomla网站搭建的基本操作指南第一章:介绍Joomla和其优势Joomla是一种开源内容管理系统,用于创建和管理网站的工具。
它是在PHP语言下开发的,具有用户友好的界面和丰富的功能。
Joomla被广泛应用于个人博客、企业网站和电子商务平台等各种类型的网站。
其优势包括灵活性,可扩展性,以及大量的模块和插件可供选择。
第二章:Joomla的安装在开始创建网站之前,我们先来了解如何安装Joomla。
首先,您需要下载Joomla的安装包并将其上传到您的网站主机。
然后,创建一个新的MySQL数据库,并将其相关信息输入到Joomla的安装向导中。
随后,按照向导的指示完成安装。
完成后,您将获得一个Joomla的管理员账户,可以用来管理您的网站。
第三章:Joomla的基本设置一旦安装完成,您需要进行一些基本设置来适应您的网站需求。
您可以设置网站的名称、描述和Logo等信息。
此外,您还可更改网站的默认语言和时区。
要进行这些设置,只需登录到Joomla的后台管理界面,转到全局配置部分,并按照您的需求逐一调整。
第四章:Joomla的模板选择与编辑Joomla提供了大量的模板供您选择,您可以根据自己的喜好和网站主题进行选择。
从Joomla官方网站或第三方网站下载所需模板,并将其上传到Joomla的模板目录中。
然后,在后台管理界面中,转到模板管理部分,选择您上传的模板并进行编辑。
您可以调整布局、颜色和字体等,以使其与您的品牌形象一致。
第五章:Joomla的内容管理Joomla的核心功能之一是内容管理。
您可以创建各种类型的内容,包括文章、图片、视频和音频等。
在后台管理界面中,您可以创建新的文章,并设置其标题、文本和元数据等信息。
此外,您还可以为文章添加标签和分类,以便更好地组织和检索。
第六章:Joomla的扩展功能Joomla的强大之处在于其丰富的模块和插件。
它们可以为您的网站增加各种功能,如社交分享、网站地图和网上支付等。
MINA2实用手册
MINA2实用手册作者:李庆丰Email:scholers@MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度,封装了很多底层的细节,然开发者把精力集中到业务逻辑上来,最近做了一个相关的项目,为了备忘对MINA做一个总结。
一、服务端初始化及参数配置MINA2初始化很简单。
基本的初始化参数如下://初始化Acceptor—可以不指定线程数量,MINA2里面默认是CPU数量+2 NioSocketAcceptor acceptor = new NioSocketAcceptor(5);java.util.concurrent.Executor threadPool =Executors.newFixedThreadPool(1500);//建立线程池//加入过滤器(Filter)到Acceptoracceptor.getFilterChain().addLast("exector", newExecutorFilter(threadPool));//编码解码器acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new WebDecoder(),newXmlEncoder()));//日志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);//设置每一个非主监听连接的端口可以重用MINA2中,当启动一个服务端的时候,要设定初始化缓冲区的长度,如果不设置这个值,系统默认为2048,当客户端发过来的消息超过设定值的时候,MINA2的机制是分段接受的,将字符是放入缓冲区中读取,所以在读取消息的时候,需要判断有多少次。
ApacheMina
制作人:江龙飞 时间:2012-03-21
讲座内容
• • • • • MINA 介绍 MINA 用途 MINA 优缺点 MINA 编程 MINA 实例演示
MINA 介绍
Apache MINA是一个网络应用程序框架,用来帮助用户简单 地开发高性能和高可靠性的网络应用程序。它提供了一个通 过Java NIO在不同的传输。例如TCP/IP和UDP/IP上抽象的 事件驱动的异步API。它可以帮助我们快速开发高性能、高 扩展性的网络通信应用,它提供了事件驱动、异步操作的编 程模型。
IoHandler
• 编写业务逻辑的地方,读取数据、发送数据基本都在这个接 口完成,每个Ioservice有且只有一个handler实例。 • Void sessionCreated(IoSession session);当session对象被创 建时调用。 • Void sessionOpened(IoSession session);连接被打开时调用 ,在create之后(紧跟其后),但sessionCreate只会第一次调用 ,而这个方法每次都会调用。 • Void sessionClosed(IoSession session);当session关闭时被 调用。 • Void sessionIdle(IoSession session,IdleStatus status);当 session闲置的时候被调用,而对于UDP协议不会被调用
IoService
• • • • • • • IoService这个服务是对于服务器端的接受连接和客户端发起连 接这两种行为的抽象。 底层的元数据信息TransportMetadata,比如底层的网络服务提 供者(NIO,ARP等 ) 通过这个服务创建一个新会话时,新会话的默认配置 IoSessionConfig 获取此服务所管理的所有会话 与这个服务相关所产生的事件所对应的监听者 ( IoServiceListener) 处理这个服务所管理的所有连接的处理器(IoHandler) 每个会话都有一个过滤器链(IoFilterChain),每个过滤器链通 过其对应的IoFilterChainBuilder来负责构建 服务创建的会话(IoSession)集,以及广播的方法 。
MINA
APACHE MINA 介绍一个高性能的NIO框架•MINA 的用途•MINA 选择MINA的理由•MINA 的快速入门•MINA 的高级话题讲座目标背景,用途以及所支持的功能的一个简略介绍,让大家认识MINA,对它有个初步概念。
这就是本章的目的。
在java世界中,框架繁多,就网络框架而言,我们为什么要选择MINA2这确实值得我们探讨一下。
下面的小节中将本着对软件开发最基本的两点出发进行对比:1.性能的对比2.程序实现的复杂性对比在传统I/O中,最简单实现高并发服务器的编程方式就是对每一个客户开启一个线程。
但是这种方式有如下几个弊端:•客户端上限很大的情况下不能及时响应•服务器硬件资源受限,性能也会急剧下降•受制于操作系统的限制优点还是有的:•编码简单,实现容易•一定数量的连接性能比较好。
参见实例:TraditionalIOServer0从图中可见,每一个线程维护了一组用户,然后每一个线程不断的轮询用户,哪个用户可读就读取相应的可读字节数,也就是这种方式避免了读的阻塞。
但是这种方式是一种被动的方式,也就是说不管用户是否可读,都需要去轮询。
为了解决这一问题,异步的NIO就成了不二之选选择MINA的理由NIO简单介绍JDK1.4提供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,又同时避免了轮询问题,但在使用上略显得复杂一些。
NIO的核心思想就是多路复用,与模型二类似。
但是它是基于事件机制,所以这就是能避开轮询的原因。
但是需要注意的是,他们本质上是不同的,模型二只能算是一个模拟的多路复用,而NIO则是利用OS底层以及一些别的技术来达到异步多路复用的目的。
看完几个实际的MINA例子后可以很轻易的总结出利用MINA编程的几个大致步骤:1.创建一个实现了IoService接口的类2.设置一个实现了IoFilter接口的过滤器(如果有需要的情况下)3.设置一个IoHandler接口实现的处理类,用于处理事件(必须)4.对IoService绑定一个端口开始工作IoProcessor是处理请求的分配,包括选择Selector,超时验证,状态记录等。
Mina2.0框架源码剖析45页
Mina2.0框架源码剖析Mina2.0快速入门MinaTimeServer.javapackage com.vista;import java.io.IOException;import java.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class MinaTimeServer{private static final int PORT = 6488;public static void main(String[] args) throws IOException{//监听即将到来的TCP连接IoAcceptor acceptor = new NioSocketAcceptor();acceptor.getFilterChain().addLast("logger", new LoggingFilter ());acceptor.getFilterChain().addLast("codec", new ProtocolCodecF ilter( new TextLineCodecFactory( Charset.forName("UTF-8"))));acceptor.setHandler(new TimeServerHandler());acceptor.getSessionConfig().setReadBufferSize(2048);acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDL E, 10);acceptor.bind(new InetSocketAddress(PORT));System.out.println("服务器启动");}}TimeServerHandler.javapackage com.vista;import java.util.Date;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;public class TimeServerHandler extends IoHandlerAdapter{public void exceptionCaught(IoSession session, Throwable cause) t hrows Exception{cause.printStackTrace();}public void messageReceived(IoSession session, Object message) th rows Exception{String strMsg = message.toString();if(strMsg.trim().equalsIgnoreCase("quit")){session.close();return;}Date date = new Date();session.write(date.toString());System.out.println("Message written");}public void sessionIdle(IoSession session, IdleStatus status) thr ows Exception{System.out.println("IDLE"+session.getIdleCount(status));}}Mina2.0框架源码剖析(一)整个框架最核心的几个包是:org.apache.mina.core.service,org.apache.mina.core.session, org.apache.mina.core.polling以及org.apache.mina.transport.socket。
mina 框架学习
mina 框架学习转帖:/s/blog_5f9beca40101ee6w.html1、简介Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP 协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。
Apache Mina也称为:l NIO框架l客户端/服务端框架(典型的C/S架构)l 网络套接字(networking socket)类库2、通信流程那么让我们来看一下mina在我们应用中处于什么样的一个位置呢上图可以看出mina位于应用程序和底层网络传输之间,它不关心底层网络数据如何传输,只负责接收底层数据,过滤并转换为Java对象提供给我们的应用程序,然后把应用程序响应值过滤并转换为底层识别的字节,提供给底层传输。
再来看一下mina 通信流程图可以很清晰看出mina主要有三个主要的业务接口:IoService,IoFilter和IoHandler(1) IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立。
(2) IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write 方向)与解码(read 方向)等功能,其中数据的encode 与decode是最为重要的、也是你在使用Mina 时最主要关注的地方。
(3) IoHandler:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。
总的来说创建一个基于mina框架的应用分为三个模块: 创建连接(IoService))——>添加消息过滤器(IoFilter)——>添加业务处理(IoHandler)3、server 和clientmina中server和client没有多大区别都是通过Ioservice建立连接和通信的,来看下具体流程Server 一般地,服务端会有一个端口来监听client的请求/packet,并且为每隔connect建立一个session(无论是基于TCP/IP协议还是UDP协议),Server端主要通过IoAccptor建立连接IOAcceptor继承自IoService主要用于监听网络进来的connecter和packet,对于一个新的连接首先会创建一个session,连接创建之后请求消息会从你的地址和监听的端口中进来并封装所以的packet接收完成之后如上图所示,过滤器链会对其进行过滤,过滤完成之后会交给IoHandler进行业务处理,这就是一个请求到达server后mina的处理流程。
详解微信小程序开发框架(MINA)
详解微信⼩程序开发框架(MINA)⼩程序MINA框架,及优点MINA框架:⼩程序使⽤的是MINA框架,⽬的是通过简单、⾼效的⽅式让开发者可以在微信中开发具有原⽣App体验的服务。
MINA的核⼼是⼀个响应的数据绑定系统。
整个系统分为两块:视图层(view,描述语⾔wxml和wxss)和逻辑层(App Serice,基于 JavaScript)。
这可以让数据与视图⾮常简单的保持同步。
当做数据修改时,只需要在逻辑层改数据,视图层就会做响应的更新。
开发者只需要将页⾯路由、⽅法、⽣命周期函数注册进框架,其他的⼀切复杂的操作都将由框架处理。
⼩程序优点:• ⽅便使⽤:⽆需下载,打开即⽤,⽤完即⾛。
不占⽤⼿机内存,省流量,省安装时间• 开发简单:开发的本质是MVVM风格的Javascript框架上开发的,有前端经验的程序员可以⽆缝衔接,⽆经验的“⼩⽩”也可以快速⼊门。
• 跨平台运⾏:不⽤再分别开发IOS和Andriod版本,只需要发布微信⼩程序平台,所有平台都可以使⽤。
开发成本低• 快速分发与迭代:⽆需关⼼各种发布渠道,也⽆须担⼼旧版本升级的兼容问题。
打开速度⽐H5快,体验接近原⽣APP⼩程序开发框架的⽬标是通过尽可能简单、⾼效的⽅式让开发者可以在微信中开发具有原⽣ APP 体验的服务。
微信团队为⼩程序提供的框架命名为MINA。
MINA框架通过封装微信客户端提供的⽂件系统、⽹络通信、任务管理、数据安全等基础功能,对上层提供⼀整套JavaScript API,让开发者⽅便的使⽤微信客户端提供的各种基础功能与能⼒,快速构建应⽤。
MINA框架微信⼩程序的框架⽰意图如下所⽰:MINA框架主要分为两⼤部分:第⼀部分页⾯视图层,开发者使⽤WXML⽂件来搭建页⾯的基本视图结构(WXML是类似于HTML标签的语⾔和⼀系列基础组件),使⽤WXSS⽂件来控制页⾯的表现样式。
第⼆部分AppService应⽤逻辑层,是MINA框架的服务中⼼,通过微信客户端启动异步线程单独加载运⾏,页⾯渲染所需的数据、页⾯交互处理逻辑都在其中实现。
MINA官方教程(中文版)
简介:Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。
它提供了一个抽象的事件驱动的异步API,可以使用TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。
Apache MINA 2 可以作为开发网络应用程序的一个良好基础。
本文将介绍Apache MINA 2 的基本概念和API,包括I/O 服务、I/O 会话、I/O 过滤器和I/O 处理器。
另外还将介绍如何使用状态机。
本文包含简单的计算器服务和复杂的联机游戏两个示例应用。
Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。
它提供了一个抽象的事件驱动的异步API,可以使用TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。
Apache MINA 2 可以作为开发网络应用程序的一个良好基础。
下面将首先简单介绍一下Apache MINA 2。
Apache MINA 2 介绍Apache MINA 是Apache 基金会的一个开源项目,目前最新的版本是 2.0.0-RC1。
本文中使用的版本是 2.0.0-M6。
从参考资料中可以找到相关的下载信息。
下面首先介绍基于Apache MINA 的网络应用的一般架构。
基于Apache MINA 的网络应用的架构基于Apache MINA 开发的网络应用,有着相似的架构。
图1中给出了架构的示意图。
图 1. 基于Apache MINA 的网络应用的架构如图1所示,基于Apache MINA 的网络应用有三个层次,分别是I/O 服务、I/O 过滤器和I/O 处理器:⎽I/O 服务:I/O 服务用来执行实际的I/O 操作。
Apache MINA 已经提供了一系列支持不同协议的I/O 服务,如TCP/IP、UDP/IP、串口和虚拟机内部的管道等。
开发人员也可以实现自己的I/O 服务。
⎽I/O 过滤器:I/O 服务能够传输的是字节流,而上层应用需要的是特定的对象与数据结构。
Mina的线程池实现分析
Mina的线程池实现分析(1)文章分类:Java编程线程池是并发应用中,为了减少每个任务调用的开销增强性能而经常使用的技术。
在mina中大量的使用这一技术,除了Executors的工厂方法构建线程池之外,它还继承自ThreadPoolExecutor提供自己的线程池的实现OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor。
这两者主要应用于ExecutorFilter过滤器。
这个过滤器是mina内部实现的众多过滤器之一,其主要作用是把I/O events提交给线程池同时处理同一个IOSession的事件,其默认的线程池的构造是前者。
这两个线程池的区别就在于同时处理I/O 事件时,前者能够保证同一个Session的事件的处理顺序,而后者则不能保证,所以有可能出现sessionClosed事件在messageReceived 事件之前被处理。
下面试着从代码解密其怎么保证事件处理顺序的。
分析Mina的源码最大的感受就是其多线程应用的精细,每次从源码解决自己的疑问都有一种难以言喻的喜悦感。
如果一般的框架的源码主要看设计结构的话,Mina的源码的精妙更在于具体的实现,虽然乍一看是复杂又混乱,呵呵。
先看看部分源码吧:Java代码1public class OrderedThreadPoolExecutor extends ThreadPoolExecutor {2 ...3private static final IoSession EXIT_SIGNAL = new DummySession();45private final AttributeKey TASKS_QUEUE = new AttributeKey(getClass(), "tasksQueue");67private final BlockingQueue<IoSession> waitingSessions = new LinkedBlockingQueue<IoSession>();89private final Set<Worker> workers = new HashSet<Worker>();1011private final AtomicInteger idleWorkers = new AtomicInteger();1213private long completedTaskCount;14private volatile boolean shutdown;15 ...16private SessionTasksQueue getSessionT asksQueue(IoSession session) {17SessionTasksQueue queue = (SessionT asksQueue) session.getAttribute(TASKS_QUEUE);18if (queue == null) {19queue = new SessionTasksQueue();20SessionTasksQueue oldQueue =21(SessionTasksQueue) session.setAttributeIfAbsent(TASKS_QUEUE, queue);2223if (oldQueue != null) {24queue = oldQueue;25}26}2728return queue;29}3031private void addWorker() {32synchronized (workers) {33if (workers.size() >= super.getMaximumPoolSize()) {34return;35}3637// Create a new worker, and add it to the thread pool38Worker worker = new Worker();39Thread thread = getThreadFactory().newThread(worker);4041// As we have added a new thread, it's considered as idle.42idleWorkers.incrementAndGet();4344// Now, we can start it.45thread.start();46workers.add(worker);4748if (workers.size() > largestPoolSize) {49largestPoolSize = workers.size();50}51}52}5354private class SessionTasksQueue {55private final Queue<Runnable> tasksQueue = new ConcurrentLinkedQueue<Runnable>();5657private boolean processingCompleted = true;58}59 ...60}首先看到的是OrderedThreadPoolExecutor的部分实现,其除了含有ThreadPoolExecutor的一些静态常量之外,这里列出了自身特有的几个变量。
Mina2.0快速入门与源码剖析
第 1页
共 38页
Mina2.0 快速入门与源码剖析
1. Mina2.0 快速入门
MinaTimeServer.java
package com.vista; import java.io.IOException; import .InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MinaTimeServer { private static final int PORT = 6488; public static void main(String[] args) throws IOException { //监听即将到来的 TCP 连接 IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter ( new TextLineCodecFactory( Charset.forName("UTF-8")))); acceptor.setHandler(new TimeServerHandler()); acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); acceptor.bind(new InetSocketAddress(PORT)); System.out.println("服务器启动"); } }
MINA框架“微行工大”校园互助平台设计与开发★
0 引言《国民经济和社会发展第十四个五年规划纲要》中要求提升便利度和改善服务体验为导向,推动生活性服务业向高品质和多样化升级,推进线上线下全渠道满足消费需求。
伴随着经济水平和移动通信技术的快速发展,互助共享的生活方式结合互联网+的时代背景,让便捷生活成为可能。
线上外卖、共享单车等行业的崛起,离不开“互联网+互助共享”的模式。
现阶段的微信小程序,已经涉及众多领域,包括饮食、政务、出行等方面。
2020年,小程序每日活跃人数已经超过4亿人次,全年交易额同比增长超100%。
微信小程序既为用户免去繁琐的安装和管理流程,也为开发者开发提供了新的选择。
笔者采用微信云开发功能进行校园互助系统的开发工作,拟设置“用户模块”“互助共享模块”“闲置商城模块”“互动评论模块”“校园信息模块”等5个模块,解决校园需求和服务供给的对接问题,作为校园互助领域的初步尝试。
1 技术分析MINA框架是微信小程序特有的开发框架,运行机制为“响应——绑定”模式,微信小程序需要的接口均在框架中。
该框架淡化了后端概念,只包括视图层以及逻辑层。
开发者利用云数据库进行数据修改,逻辑层实现,视图层更新,MINA框架如图1所示:1.1 页面视图层页面视图层为用户操作界面,将逻辑层实现的数据信息渲染至前端页面。
每个完整的微信小程序页面包含一套WX ML、WX SS、js和json文件,WX ML文件全称为WeiXin Markup Language,类似于HTML文件,用于描述小程序页面结构;WX SS文件全称为We iXin Sty le Sheet,类似于CSS文件,用于架构小程序页面样式。
MINA 框架文件功能表如表1所示。
1.2 逻辑交互层微信小程序逻辑层主要使用JavaScript语言处理程序数据的逻辑交互部分,实现用户与程序的交互功能。
逻辑层接受用户操作而产生的事件和数据,根据一定的规则和方法进行逻辑处理。
页面视图层次根据逻辑层反馈的处理结果进行页面的重新渲染。
netty-mina深入学习与对比(一)
netty-mina深入学习与对比(一)这博文的系列主要是为了更好的了解一个完整的nio框架的编程细节以及演进过程,我选了同父(Trustin Lee)的两个框架netty与mina做对比。
版本涉及了netty3.x、netty4.x、mina1.x、mina2.x、mina3.x。
这里并没有写netty5.x的细节,看了netty5的修改文档,似乎有一些比较有意思的改动,准备单独写一篇netty4.x与netty5.x的不同。
netty从twitter发布的这篇《Netty 4 at Twitter: Reduced GC Overhead 》文章让国内Java界为之一振,也小火了一把,同时netty的社区发展也不错,版本迭代非常快,半年不关注大、小版本就发了好几轮了。
但是mina就有点淡了,github上面它最后大多数代码最后的修改日期均在2013年,不过我从个人情感上还是挺喜欢mina3的代码,没有太多的用不上的功能(支持各种协议啥的),跑自带的benchmark 性能也比netty4好一些。
但是如果是生产用的话,就偏向netty多一些了,毕竟社区活跃,版本迭代也快。
1. mina、netty的线程模型mina与netty都是Trustin Lee的作品,所以在很多方面都十分相似,他们线程模型也是基本一致,采用了Reactors in threads模型,即Main Reactor + Sub Reactors的模式。
由mainreactor处理连接相关的任务:accept、connect等,当连接处理完毕并建立一个socket连接(称之为session)后,给每个session分配一个sub reactor,之后该session的所有IO、业务逻辑处理均交给了该subreactor。
每个reactor均是一个线程,sub reactor中只靠内核调度,没有任何通信且互不打扰。
在前面的博文:[ Netty 4.x学习笔记–线程模型],对netty 的线程模型有一定的介绍。
Mina使用教程
Mina使⽤教程Mina框架简介⼀、Mina基本概念1、BIO、NIO、AIOJava BIO :同步并阻塞,服务器实现模式为⼀个连接⼀个线程,即客户端有连接请求时服务器端就需要启动⼀个线程进⾏处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
使⽤API:ServerSocket、SocketJava NIO :同步⾮阻塞,服务器实现模式为⼀个请求⼀个线程,即客户端发送的连接请求都会注册到多路复⽤器上,多路复⽤器轮询到连接有I/O请求时才启动⼀个线程进⾏处理。
使⽤API:ServerSocketChannel、SocketChannel、SelectorJava AIO(NIO.2) :异步通道提供⽀持连接、读取、以及写⼊之类⾮锁定操作的连接,并提供对已启动操作的控制机制。
Java 7 中⽤于Java Platform(NIO.2)的More New I/O APIs,通过在 java.nio.channels 包中增加四个异步通道,从⽽增强了Java 1.4 中的New I/O APIs(NIO)。
使⽤API:AsynchronousServerSocketChannel、AsynchronousSocketChannel、CompletionHandler2、NIO线程模型单⼀线程单⼀Selector模型:与多线程处理BIO相⽐减少了线程数量,⽤⼀个线程循环处理ACCEPT、READ、WRITE。
但是如果某⼀次READ 或者WRITE处理时间过长,都会影响后⾯的事件响应。
3、Mina2.0的线程模型与单⼀线程处理单⼀Selector相⽐,Mina采⽤三种线程:IoAcceptor/IoConnector线程、IoProcessor线程、IoHandler线程在服务器端,bind⼀个端⼝后,会创建⼀个Acceptor线程来负责监听⼯作。
这个线程的⼯作只有⼀个:调⽤Java NIO接⼝在该端⼝上select connect事件,获取新建的连接后,封装成IoSession,交由后⾯的Processor线程处理。
Mina编程的两个注意点
Mina编程的两个注意点•1. 首先,这是一个nio的框架,仍然是采用reactor模式,知道这一点后,那么编程就没有什么难的。
nio的编程,无外乎就是这些套路,再进一步说,网络编程,也就是这些套路了。
•2. 那么剩下编程的注意点,也就是编解码的处理以及最后的业务逻辑的处理。
2.1 编解码的注意点:因为在网络编程中,client和server之间,往往需要完整的接收到一条消息的后,才交给业务逻辑处理。
具体可以参看,其中,我们常常是继承自CumulativeProtocolDecoder来实现自己的解码器,主要的docode的方法,其作用是将本次数据和上次接收到的数据(如果doDecode方法没有处理完的话),统一放到一个buffer中,之后扔给 doDecode方法处理,若处理完之后,还有剩下的数据,则继续缓存。
Java代码可以看一个具体的实现:PrefixedStringDecoder的doDecode 方法,这个decode是消息长度+具体字节流的消息格式。
Java代码其中,prefixedDataAvailable方法是判断得到IoBuffer里的数据是否满足一条消息了,如果再进去看这个方法的实现化,读取是,使用ByteBuffer的绝对位置的读取方法(这种读取不影响position的值的);当已经有一条完整的消息时,则用getPrefixedString读取(使用的是ByteBuffer的相对位置的读取方法,这会影响position的值,从而实际的消费掉数据).2.2 业务逻辑的处理注意点,一般都会使用一个线程池处理。
这里就有一个问题,有时候同一个连接的消息处理,是希望按照顺序来进行的。
这也很简单,不需要保证一个连接的所有的业务处理都限定在一个固定的线程中,但是需要保证当有消息需要处理时,这些消息的处理,都在同一个线程中完成。
当然了,mina中也有了相应的实现OrderedThreadPoolExecutor。
Mina2.0完全自学手册要点
远程通信Mina2 学习笔记引言 (3)一.Mina入门 (3)第一步.下载使用的Jar包 (3)第二步.工程创建配置 (3)第三步.服务端程序 (4)第四步.客户端程序 (7)第五步.长连接VS短连接 (9)二.Mina基础 (11)1.IoService接口 (12)2.1.1 类结构 (12)2.1.2 应用 (13)2.IoFilter接口 (15)2.2.1 类结构 (15)2.2.2 应用 (17)添加过滤器 (17)自定义编解码器 (18)制定协议的方法: (20)IoBuffer常用方法: (20)Demo1:模拟根据文本换行符编解码 (21)Demo2:改进Demo1的代码 (23)Demo3:自定义协议编解码 (33)3.IoHandler接口 (51)三.Mina实例 (51)四.其他................................................ 错误!未定义书签。
引言最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache 的这个Mina框架。
首先,Mina是个什么东西?看下官方网站(/)对它的解释:Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。
Apache Mina也称为:●NIO框架●客户端/服务端框架(典型的C/S架构)●网络套接字(networking socket)类库总之:我们简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架!(本文所有内容仅针对Mina2.0在TCP/IP协议下的应用开发)一.Mina入门先用Mina做一个简单的应用程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
支付宝(中国)网络技术有限公司
蓝秋鹏(仲景)
目录
1.前言 (3)
2.实践 (4)
2.1.服务端演示 (4)
2.2.客户端演示 (6)
3.进阶 (8)
在资金线混有两个技术框架是一定要懂得如何使用的,它们就是MINA和HTTPCLIENT(还没听过的,就先百度一下)。
支付宝和银行前置机之间的通讯基本都是使用者两种框架,即使你不懂SOCKET或者HTTP很底层的协议也没多大关系。
对于HTTPCLIENT有过很多实践了,从我刚进支付宝的第一个项目个人诚信通,到最近的建行境外收单直连改造,都是使用HTTP通讯。
突然间要做建行银行卡代扣,需要使用SOCKET跟建行通讯,对SOCKET 一点都不懂,只是听大禹和香石说使用MINA很简单,闭关修炼了两天确实很简单,哈哈。
先找到MINA的主页,肯定有很多资料可以学习的,然后再编写DEMO,跑起来,改改DEMO,添加一些个性化的功能,两天时间基本上就算入门啦,可以开始进入项目编码啦。
这些时间对于开发工程师来说,就是项目的技术准备阶段,在BRD或者PRD阶段投入的资源,让开发人员在开发阶段不再担心技术问题,可以快速编码,甚至提前完成开发任务。
跟MINA类似的框架,还有著名的Jboss Netty,代码框架非常类似,使用方法也大同小异,可以说Jboss Netty是MINA的改良版,但是目前我们系统还没有Jboss Netty的实际应用,不考虑引入到实际项目中。
本文档作为MINA框架的入门手册,浅显易懂,没有高级应用,比如配置线程模型,就可以满足日常开发。
跟银行的通讯,首先我们要定位自己的角色,我们扮演的是客户端,还是服务端,大部分场景我们都是扮演客户端的角色,如果银行有通知接口,在业务做完时银行会主动通知我们,推进我们的业务,这时我们就是服务端。
2.1.服务端演示
通过DEMO实现一个简单的服务端,MINA框架已经做了很好的封装,我们只需要编写几行代码,通过main启动MinaServer,监听端口1314:
SOCKET接口是TCP/IP网络的API,不说这些很抽象的概念,我们可以直接使用MINA封装的SocketAcceptor 。
main方法中定义了整型的端口1314,在实际应用中一般通过antx.properties配置端口,这样就可以把配置的权限交给运维部门。
每一个信息都会通过在IoAcceptor中定义的过滤器链的所有过滤器,完成个性化的日志记录和解码工作。
日志过滤器用SL4J库记录信息,而编码过滤器则解码所有收到的信息.
这个简单的例子,我们使用 new TextLineCodecFactory() 发送的信息进行编码,这是MINA自带的,功能有限,只能处理文本或者String类型。
还有一个参数new ServerHandler(),传的是实现IoHandler接口的类,对客户端的请求要进行什么业务处理,都在这里实现。
主要参考服务端处理器的实现:
messageReceived(…),对接收到的消息(已经解码)进行下一步处理,DEMO中演示的就是收到客户端的请求消息之后,都返回客户端的IP地址。
exceptionCaught(…),自定义异常处理,要不然异常会被“吃掉”。
这是服务端处理器比较重要的两个接口,还有其他一些辅助的接口,对于需要比较详细的日志记录时可以使用。
命令行:telnet 127.0.0.1 1314 (这种方法经常用来测试我们跟银行建立的专线是否畅通,而不是使用ping命令)
建立连接以后,输入hello,服务端就会有相应。
测试演示图:
2.2. 客户端演示
我们使用的是telnet 做客户端发包给服务器, 现在我们使用MINA 框架编写一个简单的客户端,你会发现客户端和服务器的代码非常类似。
通过main 方法启动客户端:
客户端演示的是直接发送String 消息,可以使用MINA 自带的编码协议,
客户端处理器和服务端处理器是很像的,它们都是在收到数据包之后的处理。
主要参考客户端处理器的实现:
这里比服务端处理器新增一个接口messageSent(…),在实际应用中我们经常需要记录我们发送给银行的日志,可以作为一种交易凭证,方便后期问题追踪。
日志的记录需要有唯一性的标记,最好的办法就是把报文的标记在发送之前保存在IoSession,使用session.getAttribute("KEY")取出标记。
客户端效果演示(因为没有配置log4j,会抛出红色警告):
服务端效果演示:
3. 进 阶
在项目开发的实际应用中,我们跟银行的通讯报文一般都不会使用String 传输,因为系统的运行环境或者编程语言一般都是不同的,最常用的就是以字节传输,报文的格式需要双方约定规范,比如xml 格式,或者定长格式,或者8583格式,最终都会转换成字节传输给银行。
那么这里就需要我们编写自定义的编码和解码方案。
编写编码方案工厂类,注册自定义的编码方案:
这里提供了两种构造函数,对于启动main 方式的测试,选择空构造行数就可以了;带参构造函数是为了兼容在实际应用中Spring 框架,在bean 声明中采用构造函数的方式注入。
工厂类的使用方法,在客户端和服务器的main 启动程序,修改MINA 框架自带的String 编码方案工厂类:
自定义的编码方案实现类:
这里处理很简单,就是把字节转化成String,那么messageReceived(IoSession session, Object message)接口获取message就是String类型的,已经经过解码。
在这里可以进行很多方式的解码,比如转化成String以后,还可以进一步转化成POJO,那么获取的message就是POJO。