ChannelPipeline

ChannelHandler实例的列表,用于处理或者截获通道的接收和发送数据,让用户可以在ChannelPipeline中完全控制一个事件以及处理ChannelHandler和ChannelPipeline的交互。

每一个新的通道,都会创建一个新的ChannelPipeline并且附加到通道,永久性的耦合。

一个入站I/O事件,这个事件会从ChannelPipeline的第一个Handler开始一次通过,出站IO事件则从最后一个Handler开始依次通过。Handler可以处理时间并检查类型,不能处理则跳过,并将事件传递给下一个Handler。

我们找到,不能有其他IO-Thread的阻塞拉力影响整体的IO处理,比如JDBC。这时候可以通过一个EventExecutorGroup,自定义的事件会被包含在EventExecutorGroup的EventExecutor处理。

ChannelHandlerContext

通过context,ChannelHandler允许与其他ChannelHandler实现交互:

1、通知下一个ChannelHandler

2、想事件流全部通过ChannelPipeline,可以通过调用Channel和ChannelPipeline的方法:

3、想事件从ChannelPipeline的指定位置开始:

ChannelHandlerContext是线程安全的,可以在外部使用。

修改ChannelPipeline

调用ChannelHandlerContext的pipeline()方法能访问ChannelPipeline,可以运行时动态调整ChannelHandler。可以保持ChannelHandlerContext供以后使用,线程安全:

public class WriteHandler extends ChannelHandlerAdapter {

    private ChannelHandlerContext ctx;

    @Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
this.ctx = ctx;
} public void send(String msg) {
ctx.write(msg);
} }

如果ChannelHandler实例带有@Sharable注解则可以被添加到多个ChannelPipeline中,也就是说单个ChannelHandler可以有多个ChannelHandlerContext;如果没有添加该注解的Handler实例添加到多个Pipeline中则会抛异常:

@Sharable
public class NotSharableHandler extends ChannelInboundHandlerAdapter { private int count; @Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
count++;
System.out.println("channelRead(...) called the " + count + " time");
ctx.fireChannelRead(msg);
}
}

ChannelHandler及其子类

ChannelHandlerAdapter

ChannelInboundHandler / ChannelInboundHandlerAdapter 处理完消息之后不会自动释放,需要ReferenceCountUtil.release(msg);

ChannelOutboundHandler / ChannelOutboundHandlerAdapter

SimpleChannelInboundHandler<T> / SimpleChannelInboundHandler<T> 处理完消息之后自动释放

ChannelOutboundHandler所有重要方法采用ChannelPromise,如果ChannelPromise没有被通知,可能会导致其中一个ChannelFutureListener没有被通知去处理一个消息:

public class DiscardOutboundHandler extends ChannelOutboundHandlerAdapter {

    @Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
ReferenceCountUtil.release(msg);
promise.setSuccess();
} }

总结一下:一般自定义消息,使用编码解码器实现字节传输,使用ChannelInboundHandlerAdapter/ChannelOutboundHandlerAdapter处理事件或者状态改变,使用SimpleChannelInboundHandler/SimpleChannelOutboundHandler处理消息。

Netty入门(3) - ChannelHandler的更多相关文章

  1. Netty入门

    一.NIO Netty框架底层是对NIO的高度封装,所以想要更好的学习Netty之前,应先了解下什么是NIO - NIO是non-blocking的简称,在jdk1.4 里提供的新api,他的他的特性 ...

  2. netty入门(一)

    1. netty入门(一) 1.1. 传统socket编程 在任何时候都可能有大量的线程处于休眠状态,只是等待输入或者输出数据就绪,这可能算是一种资源浪费. 需要为每个线程的调用栈都分配内存,其默认值 ...

  3. Netty入门教程——认识Netty

    什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Netty 是一个广泛使用的 Java 网络编程框架(N ...

  4. Netty 系列(三)Netty 入门

    Netty 系列(三)Netty 入门 Netty 是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络服务器和客户端程序.更多请参考:Netty Github 和 Netty中文 ...

  5. Netty入门二:开发第一个Netty应用程序

    Netty入门二:开发第一个Netty应用程序 时间 2014-05-07 18:25:43  CSDN博客 原文  http://blog.csdn.net/suifeng3051/article/ ...

  6. 1.Netty入门

    Netty入门 1.Netty介绍 (1)百度百科介绍: Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络 ...

  7. Java网络编程 -- Netty入门

    Netty简介 Netty是一个高性能,高可扩展性的异步事件驱动的网络应用程序框架,它极大的简化了TCP和UDP客户端和服务器端网络开发.它是一个NIO框架,对Java NIO进行了良好的封装.作为一 ...

  8. Netty Pipeline与ChannelHandler那些事

    Pipeline和ChannelHandler是Netty处理流程的重要组成部分,ChannelHandler对应一个个业务处理器,Pipeline则是负责将各个ChannelHandler串起来的& ...

  9. Netty入门与实战教程总结分享

    前言:都说Netty是Java程序员必须要掌握的一项技能,带着不止要知其然还要知其所以然的目的,在慕课上找了一个学习Netty源码的教程,看了几章后着实有点懵逼.虽然用过Netty,并且在自己的个人网 ...

随机推荐

  1. jdk1.8 HashMap的keySet方法详解

    我在看HashMap源码的时候有一个问题让我产生了兴趣,那就是HashMap的keySet方法,没有调用HashMap的有关数据的任何方法就能获取到map的所有的键,他是怎么做到的,然后我就通过模拟k ...

  2. maven 引用另一个jar包 需要先打包在仓库里面 并在pom里面配置 才可以引用

    maven 引用另一个jar包 需要先打包在仓库里面 并在pom里面配置 才可以引用

  3. map()实现zip()功能

    c = (map(lambda x,y:(x,y),[1,2,3],["abd","def","ghi"]))print(list(c)) ...

  4. 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)

    在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...

  5. Mac 下重新安装配置ibm Lotus 邮箱

    若邮箱之前有人使用,需要重新安装.在卸载程序之后,发现仍旧无法重新配置新的账号. 此时需要删除用户目录下的2个文件: /Library/Application Support/IBM Notes Da ...

  6. 实现 60fps 的网易云音乐首页

    网易云音乐是一款很优秀的音乐软件,我也是它的忠实用户.最近在研究如何更好的开发TableView,接着我写了一个Model驱动的小框架 - MDTable.为了去验证框架的可用性,我选择了网易云音乐的 ...

  7. Cgod省选的爆零日记

    声明 虽然是日记,但博主太咕咕咕了,所以可能会鸽掉. 3.11 辣鸡杭二的机子,卡我常数,削我分数. 他们那边的机子好像比我们慢四倍的样子? 开局刚\(T3\),分数全靠骗. \(yy\)许久\(GG ...

  8. 【ARC063E】Integers on a tree

    Description 给定一棵\(n\)个点的树,其中若干个点的权值已经给出.现在请为剩余点填入一个值,使得相邻两个点的差的绝对值恰好为1.请判断能否实现,如果能,请将方案一并输出. Solutio ...

  9. 使用netty编写IM通信界面

    前驱知识 WebSocket 维基百科: WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补 ...

  10. Jenkins中使用Azure Powershell连接Service Fabric报错not recognized的原因与解决办法

    一.使用背景 在涉及Azure service Fabric的自动化应用场景中,依赖于Service Fabric的Azure Powershell cmdlets,我们可以使用Jenkins能实现c ...