`

mina1.x与2.x的区别

    博客分类:
  • MINA
阅读更多

Apache MINA 2.x提供了一个全新的API,其抛弃向后兼容1.x2.x简化了先前API中过于复杂的部分,在牺牲某种程度的向后兼容性后变得更直观。请注意,本节仅仅解释不兼容的改变,因为API的大部分还是向后兼容的。

包与命名

l         所有的类和方法严格遵循驼峰命名法则

例如SSLFilter被更名为SslFilter,其它很多类也是如此。

l         所有NIO传输类增加‘Nio’前缀

由于NIO并非socket/datagram传输的唯一实现,因此‘Nio’前缀加在了所有的NIO传输类上。

改变之前:

    SocketAcceptor acceptor = new SocketAcceptor(); 

改变之后:

SocketAcceptor acceptor = new NioSocketAcceptor();   

 

l         Filter类被重新整理到多个子包中

随着开箱即用的filter实现数量的增加,所有的filter都被移到相应的子包中(例如,StreamWriteFilter移至org.apache.mina.filter.stream)

l         *.support中的所有类被移到了其父包(或者其它包)

为了避免循环依赖,*.support包中的所有类被移到其父包或其它包中。你可以在IDE(例如Eclipse)中简单地修改这些包的导入来解决编译错误。

Buffers

l         MINA ByteBuffer重命名为IoBuffer

因为MINA ByteBufferJDKNIO ByteBuffer同名,很多用户发现与其组员沟通时存在很多困难。根据用户的反馈,我们将MINA ByteBuffer重命名为IoBuffer,这样类名就更加简化和明确。

l         Buffer池被移除,IoBuffer.allocate(int) 默认分配一个堆(heap buffer

1.       不再有易犯错的acquire()release()方法,如果你愿意,你可以调用free()方法,但这是可选的。请自己承担使用这个方法的风险。

2.       在大多数JVM中更好的开箱即用的性能和稳定性。

Direct buffer池是MINA早期版本所标榜的众多特性之一。然而根据当今基准,在主流的JVMdirect buffers的表现要比heap buffers差。此外,当direct buffer 内存的最大值没有被正确设定时,突如其来的OutOfMemoryError经常出现。

为了提供更好的开箱即用的性能和稳定性,Apache MINA项目组决定将默认的buffer类型由direct改为heap。因为heap buffers并不需要池化,PooledByteBufferAllocator也被移除了。由于没有了池的概念,ByteBuffer.acquire()  ByteBuffer.release()也就被移除了。

然而,如果分配发生的太快,分配heap buffers也会成为瓶颈。这是因为任何字节数组的分配都要填充其元素内容为0,而这会消耗大量的内存带宽。CachedBufferAllocator可以用来解决这个问题,但是在大多数情况下,你还是应该使用默认的SimpleBufferAllocator

启动和配置

IoService的配置被简化

1.x中,有很多种方式来配置IoService和它的子接口(IoAcceptorIoConnector)。基本上,有两种配置方式:

1.       调用bind()connect()时,具体指定一个IoServiceConfig

SocketAcceptor acceptor = new SocketAcceptor();

SocketAcceptorConfig myServiceConfig = new SocketAcceptorConfig();

myServiceConfig.setReuseAddress(true);   

acceptor.bind(myHandler, myServiceConfig);

2.       使用IoService.defaultConfig属性,不需要指定一个IoServiceConfig

SocketAcceptor acceptor = new SocketAcceptor();

acceptor.getDefaultConfig().setReuseAddress(true);

acceptor.bind(new InetSocketAddress(8080), myHandler);

 

配置IoFilterChain带来另一个令人头痛的问题,因为除了IoServiceConfig内部的IoFilterChainBuilder外,还有一个全局的IoFilterChainBuilder,这就意味着使用两个IoFilterChainBuilders来配置一个IoFilterChain。大多数用户仅使用全局的IoFilterChainBuilder来配置IoFilterChain,而这就足够了。

IoAcceptor acceptor = new SocketAcceptor();

acceptor.getFilterChain().addLast("myFilter1", new MyFisrtFilter());

acceptor.getDefaultConfig().getFilterChain().addLast("myFilter2", new MySecondFilter());

acceptor.bind(new InetSocketAddress(8080), myHandler); // Which filter will be the first?

为了解决这一复杂问题,MINA 2.0简化了网络应用程序的启动,请比较下面的代码与前面代码的不同。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SocketAcceptor acceptor = new SocketAcceptor();

acceptor.setReuseAddress(true);

acceptor.getFilterChain().addLast("myFilter1", new MyFirstFilter());

acceptor.getFilterChain().addLast("myFilter2", new MySecondFilter());

acceptor.getSessionConfig().setTcpNoDelay(true);

 

// You can specify more than one addresses to bind to multiple addresses or interface cards.

acceptor.setLocalAddress(new InetSocketAddress(8080));

acceptor.setHandler(myHandler);

 

acceptor.bind();

 

// New API restricts one bind per acceptor, and  you can't bind more than once.

// The following statement will raise an exception.

acceptor.bind();

你可能已经注意与Spring框架的集成也将变得更加简单。

线程 

l         ThreadModel被移除

最初引入ThreadModel概念是为了简化IoService使用预定义线程模型的过程。然而,配置线程模型变得越来越简单以至于不用引入新的组件。与其易用性相比,线程模型带了更多的混乱。在2.x中,当且仅当你需要时,你才需要明确地添加一个ExecutorFilter 

l         ExecutorFilter使用一个特定的Executor实现来维系事件顺序

1.x中,可以使用任意指定的Executor来维系事件顺序,但2.x提供了两个新的ThreadPoolExecutor实现,OrderedThreadPoolExecutorUnorderedThreadPoolExecutorExecutorFilter维系事件顺序,在以下两种情况:

1.       当使用默认构造方法时,ExecutorFilter创建一个OrderedThreadPoolExecutor,或者

2.       明确指明使用OrderedThreadPoolExecutor

OrderedThreadPoolExecutorUnorderedThreadPoolExecutor具有防止发生OutOfMemoryError的机制,所以你应该尽量使用这两个类而不是其它Executor的实现。 

协议编解码

DemuxingProtocolCodecFactory被重写

新增了DemuxingProtocolEncoderDemuxingProtocolDecoder两个类,DemuxingProtocolCodecFactory只是这两个类的门面。register() 方法重命名为addMessageEncoder() addMessageDecoder(),这个变化给编解码器的实现者以更多的自由混合使用不同的encodersdecoders

MessageEncoder接口也发生了改变,MessageEncoder.getMessageTypes()被移除了,当调用addMessageEncoder()时,你需要指明encoder可编码的信息类型。

集成

l         JMX集成被重写

大部分旧有代码被抛弃,JMX集成完全重写。现在的JMX集成模块基于MBean模型并使用OGNL管理属性。

请参考“Image Server”例子了解JMX集成的细节。

l         Spring集成简化了

Spring集成也大为重写和简化,下面给出变化的摘要:

1.       org\apache\mina\integration\spring\ssl被移除。

2.       org.apache.mina.integration.spring包更名为org.apache.mina.integration.xbean,目的是与Spring脱钩从而也支持其它的DI框架。

3.       新的集成构建于集成Bean包,如上所述。

请参考“Chat example”例子了解最新的Spring集成的细节。

其它的改变

l         TransportType更名为TransportMetadata

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

l         IoSessionLogger被重写

目前,IoSessionLogger实现了SLF4J Logger接口,所以你可以像声明SLF4J logger实例一样声明它,这个变化使你不必向其它不必要的部分暴露IoSessionLogger对象。另外,在使用MDCMapped Diagnostic Context)时,请考虑使用简单的 MdcInjectionFilter,这时IoSessionLogger是没有必要的。

改变之前:

IoSessionLogger.debug(session, ...);   

 

改变之后:

Logger logger = IoSessionLogger.getLogger(session);

logger.debug(...);

l         BroadcastIoSession被合并到IoSession

ReadThrottleFilterBuilderReadThrottleFilter替代并最终被移除。

 

分享到:
评论

相关推荐

    mina2.x开发示例

    **Mina2.x开发示例** Apache Mina是一个开源项目,提供了一个高度可扩展的网络通信框架,适用于各种协议,如TCP、UDP和HTTP。它主要用于简化开发高性能、高并发的网络应用程序,如服务器和客户端。在Mina2.x版本中...

    mina2核心框架

    1. **事件驱动模型**:MINA2采用非阻塞I/O(NIO)模型,通过事件驱动的方式处理网络请求。这种模型允许服务器同时处理多个连接,显著提高了并发性能,尤其是在处理大量短连接时。 2. **协议无关性**:MINA2的设计...

    Apache.Mina.Server.2.0.中文参考手册_李海峰

    #### 四、Mina 2.0 与 Mina 1.x 的区别 虽然Mina 1.x系列已经非常成熟和稳定,但2.0版本在设计上做出了较大的改进,以适应更高的性能要求和更复杂的业务场景。Mina 2.0引入了更多现代化的特性,例如: - 更加灵活的...

    基于Java8,SpringBoot,WebFlux,Netty,Vert.x,Reactor等开发, 一个全响应式的物联网平台

    JetLinks 基于Java8,Spring Boot 2.x ,WebFlux,Netty,Vert.x,Reactor等开发, 是一个全响应式的企业级物联网平台。支持统一物模型管理,多种设备,多种厂家,统一管理。统一设备连接管理,多协议适配(TCP,MQTT,UDP,CoAP,...

    高性能Java网络框架 MINA.7z

    2. **过滤器链机制**:MINA采用了过滤器链的设计模式,允许开发者通过添加、删除或调整过滤器来处理网络通信的各种需求,如数据编码解码、身份验证、压缩等。 3. **协议无关性**:MINA不局限于特定的网络协议,它...

    java-mina通信框架详解.docx

    Mina分为1.x和2.x两个主要分支,推荐使用最新的2.0版本。框架中包含了Server和Client的封装,简化了网络通信结构。在Mina的架构中,IoService接口负责在一个线程上建立套接字连接,并通过Selector监听连接状态。当...

    Apache_Mina_Server中文参考手册.pdf

    由于Mina 2.x版本和1.x版本在功能上存在一些差异,所以开发者在使用Mina 1.x版本中的一些功能可能并不适用于2.x版本。在学习Mina框架的相关文档前,开发者需要具备一定的Java基础,特别是要熟悉Java IO、Socket编程...

    Apache-Mina-2.rar_apache mina_java mina_mina_mina-core-1.1.3

    标题中的"Apache-Mina-2.rar"和"mina-mina-core-1.1.3"表明这是关于Apache Mina 2.x版本,特别是其核心模块的1.1.3版本。 Apache Mina的名称来源于"Multi-purpose Infrastructure for Network Applications",它...

    Mina案例+使用文档.pdf

    Mina有1.0.x和1.1.x两个主要分支,其中1.0.x版本适合运行在JDK 1.4环境下,而1.1.x则要求JDK 1.5或以上版本。 - **依赖库**:除了Mina的核心库(如mina-core-1.1.7.jar),还需要下载SLF4J(Simple Logging Facade ...

    mina中文开发手册.pdf

    Apache Mina Server分为两个主要的版本分支,即1.x和2.x版本。在本手册中,将重点讲解最新版本的Mina 2.0,需要注意的是,Mina 1.x版本中的一些功能可能在2.0版本中并不适用,因此需要开发者更新知识库以适应新版本...

    protobuff3.x版本 window java

    标题中的“protobuff3.x版本 window java”指的是在Windows操作系统上使用Java语言与Protocol Buffers(Protobuf)3.x版本进行交互。Protocol Buffers是Google开发的一种数据序列化协议,它提供了一种高效、跨平台的...

    MINA2与Netty4比较分析

    接下来将根据标题和描述的要求详细分析Mina2与Netty4的区别,重点从它们的线程模型、Buffer使用以及Netty4中集成的序列化工具ProtoBuf等方面进行比较。 首先,Mina2和Netty4都是异步事件驱动的网络应用框架。Netty4...

    Mina2.0完全剖析,完全自学手册

    log4j.appender.MINA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{1} %x - %m%n log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/minademos.log log4...

    mina2.0.7实例(服务器端与客户端)

    服务器端模拟SFS2X的一些实用功能对mina框架作了一定的封装,使用起来己经和SFS2X没有 太多的区别,但客户端只能使用mina组件(也就是说只能是JAVA客户端,这个实在有点麻烦,一直 想应用在unity3d中,没有实现,不懂...

    Apache Mina

    本文档专注于最新的Mina 2.0版本,该版本在功能和性能上相较于1.x有显著提升,但同时也意味着部分功能可能与1.x版本存在差异,因此,在使用过程中需注意版本间的兼容性问题。 #### 技术要求 为了能够充分利用Mina...

    Mina中文参考手册-API

    在Mina框架中,主要分为两个版本:1.x和2.x。文档中提到的是最新版本2.0,如果读者之前使用的是Mina 1.x版本,可能会发现某些功能并不适用。Mina的API设计目的是将网络通信的复杂性与应用程序代码隔离开来,使得...

Global site tag (gtag.js) - Google Analytics