Netty5.x中新增和值得注意的点

支持Android

提供了:

  • 移动设备变成更加强大
  • 通过Ice Cream Sandwich解决了在ADK中最著名的与NIO和SSLEngine相关的问题,且
  • 用户显然想要重用他们应用中的的编解码和处理器代码。

我们决定官方支持Android(4.0及以上版本)

简化处理器层次

ChannelInboundHandler和ChannelOutboundHandler整合为ChannelHandler。ChannelHandler现在包含输入和输出的处理方法。

ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter和ChannelDuplexHandlerAdapter已被废弃,由 ChannelHandlerAdapter代替。

由于现在无法区分处理器(handler) 是输入还是输出的处理器,CombinedChannelDuplexHandler现在由 ChannelHandlerAppender代替。

更多相关变化,可参考
https://github.com/netty/netty/pull/1999

channelRead0() → messageReceived()

我知道。这是一个愚蠢的错误。如果你使用了SimpleChannelInboundHandler,你需要把channelRead0()重命名为messageReceived()。

废弃中移除的

Channel.deregister()已被移除。不再生效和被使用。取而代之的,我们将允许Channel被充注册到不同的事件循环。

ChannelHandlerContext.attr(..) == Channel.attr(..)

Channel和ChannelHandlerContext类都实现了AttributeMap接口,使用户可以在其上关联一个或多个属性。有时会让用户感到困惑的是Channel和ChannelHandlerContext都有其自己的存储用户定义属性的容器。例如,即使你通过Channel.attr(KEY_X).set(valueX)给属性‘KEY_X’赋值,你却无法通过ChannelHandlerContext.attr(KEY_X).get()方法获取到值。反之亦是如此。这种行为不仅仅令人不解而且还浪费内存。

为了解决这个问题,我们决定每个Channel内部仅保留一个map。AttributeMap总是用AttributeKey作为它的key。AttributeKey确保键的唯一性,因此每个Channel中如果存在一个以上的属性容易是多余的。只要用户把他自己的AttributeKey定义成ChannelHandler的private static final变量,就不会有出现重复key的风险。

更简单更精确的缓冲区泄漏追踪

之前,查找缓冲区泄漏是很困难的,并且泄漏的警告信息也不是很有帮助。现在我们有了增强的泄漏报告机制,该机制会在增长超过上限时触发。

更多的信息可查看:http://netty.io/wiki/reference-counted-objects.html 。由于该特性十分重要,所以也移植入了4..0.14.Final版中。

PooledByteBufAllocator成为默认的allocator

在4.x版本中,UnpooledByteBufAllocator是默认的allocator,尽管其存在某些限制。现在PooledByteBufAllocator已经广泛使用一段时间,并且我们有了增强的缓冲区泄漏追踪机制,所以是时候让PooledByteBufAllocator成为默认了。

全局唯一的Channel ID

每个Channel现在有了全局唯一的ID,其生成的依据是:

* MAC地址(EUI-48或是EUI-64),最好是全局唯一的,

* 当前进程的ID

* System#currentTimeMillis()

* System#nanoTime()

* 随机的32位整数,以及

* 系列递增的32位整数

可通过Channel.id()方法获取Channel的ID。

更灵活的线程模型

增加了新的ChannelHandlerInvoker接口,用于使用户可以选择使用哪个线程调用事件处理方法。替代之前的在向ChannelPipeline添加 ChannelHandler时指定一个EventExecutor的方式,使用该特性需要指定一个用户自定义的 ChannelHandlerInvoker实现。

关于该变化更多的信息,可参考:
https://github.com/netty/netty/commit/132af3a485015ff912bd567a47881814d2ce1828

EmbeddedChannel的易用性

EmbeddedChannel中的readInbound()和readOutbound()方法返回专门类型的参数,因此你不必在转换他们的返回值。这可以简化你的测试用例代码。

EmbeddedChannel ch = ...; // BEFORE: FullHttpRequest req = (FullHttpRequest) ch.readInbound(); // AFTER: FullHttpRequest req = ch.readInbound();

使用Executor代替ThreadFactory

有些应用要求用户使用Executor运行他们的任务。4.x版本要求用户在创建事件循环(event loop)时指定ThreadFacotry,现在不再是这样了。

关于该变化的更多信息,可参考:https://github.com/netty/netty/pull/1762

Class loader友好化

一些类型,如AttributeKey对于在容器环境下运行的应用是不友好的,现在不是了。

编解码和处理器(handlers)

* XmlFrameDecoder支持流式的XML文档

* 二进制的memcache协议编解码

* 支持SPDY/3.1 (也移植到了4.x版本)

* 重构了HTTP多部分的编解码

Netty5.x中新增和值得注意的点,布布扣,bubuko.com

时间: 2024-08-06 16:04:16

Netty5.x中新增和值得注意的点的相关文章

Bash 4.4 中新增的 ${[email protected]} 语法

Bash 4.4 中新增了一种 ${...} 语法,长这样:${[email protected]}.根据不同的 operator,它展开后的值可能是 parameter 这个参数的值经过某种转换后的值,又可能是关于 parameter 参数自身的某种信息.这句话太抽象了,还是看下面的详细解释吧. operator 一共有 5 种值,分别是 Q.E.P.A.a,都是单个的字母. Q quote 的缩写,这个 operator 的功能是把 parameter 的值加上合适的引号,从而转换成在脚本中

C++中几个值得分析的小问题(2)

下面有3个小问题,作为C++ Beginner你一定要知道错在哪里了. 1.派生类到基类的引用或指针转换一定“完美”存在? 一般情况,你很可能会认为:派生类对象的引用或指针转换为基类对象的引用或指针是一件很正常的事.那要是不一般情况呢?请看下面这个例子: class Person { public: Person(const string& str = "Normal Person") : ID(str) {} string ID; //作为一般的人身份是“普通人”,作为学生身

在Maven中新增自定的jar包

引言: 在软件项目中,Maven提供了一体化的类库管理系统,非常实用.但是,如果新增的类库jar在网络上无法获取到,如何在本地按照Maven的规则添加进来呢?本文将通过一个小例子展示新增过程. 背景介绍: 一个Maven管理的Java项目,提供一个系统级别的POM.xml,其中定义了整个项目使用的类库. 需求: 需要添加一个自定义的类库到当前项目中.假定当前的类库文件名为:abc.jar.. 如何将类库添加进来? 1.  找到当前Maven的Repository类库位置 一般默认情况下,在win

ES5中新增的Array方法详细说明

ES5中新增的不少东西,了解之对我们写JavaScript会有不少帮助,比如数组这块,我们可能就不需要去有板有眼地for循环了. ES5中新增了写数组方法,如下: forEach (js v1.6) map (js v1.6) filter (js v1.6) some (js v1.6) every (js v1.6) indexOf (js v1.6) lastIndexOf (js v1.6) reduce (js v1.8) reduceRight (js v1.8) 浏览器支持 Ope

关于DevExpress GridControl控件中新增复选按钮一事

关于DevExpress GridControl新增复选按钮的事情,查了一下网上的文档,发现都是在查询的数据集[table]中新增一列供checkbox绑定使用.偶尔的一瞬间,我在DevExpress 的Demo上发现有使用CheckBox的例子,找了半天Demo的代码,还是没找到.然后就找到了设置的属性. 晚上的时候,想了想,感觉能试出来简直是运气.如下配置即可: 设置GridView中的[OptionsSelection]->[MultiSelectMode]设置为CheckBoxRowSe

AJAX-----13HTML5中新增的API---FormData

FormData 表单数据对象,这是在HTML5中新增的一个API,他能以表单对象做参数,自动的将表单的数据打包,当ajax发送数据是,发送FormData内的表单数据给后端即可 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <scri

Genymotion中新增了虚拟设备后,设备无法启动的解决

在Android模拟器Genymotion中新增了虚拟设备之后,试图启动,发现报错无法启动. 将设备删除重新新建一次,情况相同. 打开VitualBox,看到我已创建的虚拟设备,在VirtualBox中尝试启动,报错如下: VT-x is disabled in the BIOS for both all CPU modes (VERR_VMX_MSR_ALL_VMX_DISABLED), 发现是未启动BIOS的虚拟化设置. 解决方法: 上网搜索开启CPU虚拟化设置的方法.

在 .NET 4.0 中使用 .NET 4.5 中新增的特性(CallerMemberNameAttribute/CallerFilePathAttribute/CallerLineNumberAttribute)

介绍 标题中所说的三个特性 CallerMemberNameAttribute / CallerFilePathAttribute / CallerLineNumberAttribute 我们统称为调用者信息特性,正常情况下在 .NET Framework 4.0 中是无法使用的.因为这三个特性是 .NET Framework 4.5 中新增的.然而这三个特性的作用只是请求编译器在编译过程中进行代码的转换. 使用示例 static void Main( string[] args ) { var

mysql -- 存储过程 往数据表中新增字段

需求: 往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作:若该字段不存在,则新增) 百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭 第一版: DELIMITER $$ CREATE PROCEDURE insert_column() BEGIN IF NOT EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema='ltivalley' AND table_na