Mina2 与 Mina1变化

一、包与类名。

1、所有类和方法严格使用驼峰法命名。例:SSLFilter 更名为 SslFilter。NIO传输类在命名时增加 Nio 前缀。因为NIO 并不是 socket/datagram 传输的实现,NIO 的所有传输类前缀增加 Nio 。之前Java代码:

[java] view plain copy

  1. SocketAcceptor acceptor = new SocketAcceptor();

修改之后的代码:

[java] view plain copy

  1. SocketAcceptor acceptor = new NioSocketAcceptor();

2、Filter 类被重新整理进多重子包内。例如,StreamWriteFilter 被移动到 org.apache.mina.filter.stream ,*.support 的所有包被移动到其父包中。

二、Buffers。

因为MINA ByteBuffer 与JDK中NIO ByteBuffer 同名,ByteBuffer 被重命名为 IoBuffer。不仅使类名简化,也使类名称更加明确。放弃 Buffer 池,默认使用IoBuffer.allocate(int) 来分配 heap buffer。acquire() 与 release() 两个方法将不再容易发生错误,可以调用 free()方法。在大多数JVM中,框架内置的IoBuffer 性能更加强劲稳定。

Direct buffer 池是Mina 早期特性之一,现在主流JVM的 direct buffers 的表现比heap buffers 差,此外 direct buffer memory 的最大值没有正确设定时,不可预期的 outofmemoryError 也经常出现,所以新的版本 buffer类型由 direct 改为 heap 。heap buffers 不需要池化,PooledBufferAllocator 也被除掉了,相应的ByteBuffer.acquire()  release()也被除掉了。 但是如果使用的速度太快,分配 heap buffers也会成为瓶颈,因为分配字节数据要将所有的元素都置为0,这个操作消耗内存带宽。 CachedBufferAllocator 是针对这种情况使用的,但是大多数情况,还是使用默认的 SimpleBufferAllocator 。

三、启动与配置。

1、IoService 配置简化,1.x版本中邮多种方式配置IoService 和它的子接口 IoAcceptor 和 IoConnector 两种方法:在调用bind() 或 connect() 时,具体指定一个 ioServiceConfig

[java] view plain copy

  1. acceptor = new SocketAcceptor();
  2. SocketAcceptorConfig cfg = new SocketAcceptorConfig();
  3. cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter(MinaUAEncoder.class,MinaUADecoder.class));
  4. acceptor.bind( new InetSocketAddress(address, port), new DirectClientSessionHandler(), cfg);

或者 IoService.defaultConfig 属性,此时不需要指定 IoServiceConfig

[java] view plain copy

  1. acceptor = new SocketAcceptor();
  2. acceptor.getDefaultConfig().setReuseAddress(true);
  3. acceptor.bind(new InetSocketAddress("127.0.0.1", 8888), myHandler);

Mina2 简化了网络应用程序的启动,

[java] view plain copy

  1. //Create acceptor
  2. IoAcceptor acceptor = new NioSocketAcceptor();
  3. acceptor.getFilterChain().addLast("logger", new LoggingFilter());
  4. acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
  5. acceptor.setHandler(new HelloWorldServerHandler());
  6. //configurate the buffer size and the iddle time
  7. acceptor.getSessionConfig().setReadBufferSize(2048);
  8. acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
  9. try {
  10. acceptor.bind(new InetSocketAddress(PORT));
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }

四、线程。

ThreadModel 被移除了,最初引入ThreadModel 是为了简化 ioService 预定义的线程模式,配置线程模式却变得非常简单以至于不能引入新的组件,与其易用性相比,线程模式带来了更多的混乱。

ExecutorFilter使用一个特定的Executor实现来维系事件顺序。
在1.x中,可以使用任意的Executor实现来来维系事件顺序,但2.x提供了两个新的
ThreadPoolExecutor实现,OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor,ExecutorFilter维系事件顺序,当以下两种情况:当使用默认构造方法时,ExecutorFilter创建一个OrderedThreadPoolExecutor,或者明确指明使用OrderedThreadPoolExecutor时
OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor内部使用了一些架构来防止发生OutOfMemoryError,所以你应该尽量使用这两个类而不是其他Executor的实现。

五、协议编解码。

DemuxingProtocolCodecFactory被重写了。
新增了DemuxingProtocolEncoder和DemuxingProtocolDecoder两个类,DemuxingProtocolCodecFactory只是这两个类的外壳。register()方法被重命名为addMessageEncoder()和addMessageDecoder(),这个变化使混合使用多个encoders和decoders变得更加自由。
MessageEncoder接口也发生了改变,MessageEncoder.getMessageTypes()被移除了,当你调用addMessageEncoder(),你只需要指明信息的类型,encoder就可以进行正确的编码了。

六、集成。

JMX集成被重新设计。

spring 集成被简化。

七、其他。

TransportType 更名为 TransportMetadata

TransportType 改名是因为它的角色是元数据而不仅仅是一种枚举。

IoSessionLogger 被重新设计。

IoSessionLogger 实现了 SLF4Logger接口,所以可以像声明简单SLF4Logger实例一样声明它,这个变化使你不必向其他不必要的部分暴露 IoSessionLogger 对象。在使用 MDC 时,请考虑使用简单的 MdclnjectionFilter

时间: 2024-10-26 20:32:00

Mina2 与 Mina1变化的相关文章

架构设计:系统间通信(19)——MQ:消息协议(上)

1.概述 从本文开始,我们介绍另一类型的系统间通讯及输:MQ消息队列.首先我们将讨论几种常用消息队列协议的基本原理和工作方式,包括MQTT.XMPP.Stomp.AMQP.OpenWire等.然后在这个基础上介绍两款MQ产品:ActiveMQ和RabbitMQ,它们是现在业务系统中应用广泛的消息队列软件.包括他们的安装.运行.支持协议.集群化和调用方式. 当然,在这个过程中我们还会提到其他的消息队列协议(或者实现),例如微软JBossMQ.MSMQ.商业化产品WebSphere MQ.Oracl

【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战

概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty4(Netty5已经被取消开发了:详见此文). 本文中,服务端将分别用MINA2和Netty4进行实现,但在你实际的项目中服务端实现只需选其一就行了.本文中的Demo同时

【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同时用MINA2和Netty4分别实现服务端的目的,是因为很多人都在纠结到底是用MINA还是Netty来实现高并发的Java网络通信服务端,在此干脆两个都实现了,就看你怎么选择了,够吊吧. NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,M

使用path监听指定文件系统的变化

在以前的JAVA版本中,如果程序需要检测文件的变化,那么需要开辟一个线程每隔一段时间去遍历一次指定的目录,如果发现此次遍历结果和上次不同,那么就认为文件变动了 ,这样的方式非常繁琐,JAVA 7之后的NIO.2 Path类提供了一个方法来监听指定文件目录内文件的变化状态. 1.获取文件系统的WatchService对 2.使用Path类的方法去注册一个监听,指定监听文件的哪些状态,如新增.修改.删除. package com.nio2; import java.io.IOException;im

Tkinter,label内容随多选框变化

当我们改变一个组件后,其他组件一起变化怎么做呢?下面是一个例子 from tkinter import Tk, Checkbutton, Label from tkinter import StringVar, IntVar root = Tk() text = StringVar() text.set('old') status = IntVar() def change(): if status.get() == 1:   # if clicked text.set('new') else:

Android简易实战教程--第十九话《手把手教您监听EditText文本变化,实现抖动和震动的效果》

监听文本输入情况,仅仅限于土司略显low点,这一篇就稍微"高大上"些,体验一下滚动和震动. 首先,需要两个文件.截图: 两个文件的内容分别如下: cycle_7: <?xml version="1.0" encoding="utf-8"?> <!-- 表示循环的次数 --> <cycleInterpolator xmlns:android="http://schemas.android.com/apk/re

Entity Framework 6 Recipes 2nd Edition(9-3)译-&gt;找出Web API中发生了什么变化

9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Frist实现数据访问管理. 本例,我们模拟一个N层场景,用单独的客户端(控制台应用)来调用单独的基于REST服务的Web网站(WEB API应用) . 注意:每层使用单独的Visual Studio 解决方案, 这样更方便配置.调试和模拟一个N层应用. 假设有一个如Figure 9-3所示的旅行社和预订

如何实现色条随输入密码长度变化效果

如何实现色条随输入密码长度变化效果:在很多网站注册页面都有这样的功能,当用户输入密码的时候,下面会出现一个色条,色条的长度会跟随输入密码的长度变化,并且色条的颜色也会根据输入密码长度的不同有所改变,一般是用来提示密码强度.下面就简单介绍一下使用jQuery如何实现此功能.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="auth

处理Android程序运行时的配置变化

本篇文章翻译自Android官方文档Handling Runtime Changes,有翻译错误请留言告知,多谢. Android程序在运行期间设备的配置是可能发生改变的(例如屏幕的方向,键盘可用性,和语言等).当这些配置发生变化时,Android会重启正在运行的Activity(先调用onDestory(),紧接着调用onCreate()).这个设计是为了让你的程序在配置发生变化时,使用不同的资源自动去适配新的配置机器. 正确的处理重启,一件很重要的事就是通过Activity正常的生命周期去恢