ChannelHandler原理

1.创建ChannelPipeline的方法是实现接口 ChannelPipelineFactory 中的那个 getPipeline() 方法,然后根据自己的业务需要加入相应的 ChannelHandler。

2.

接口 ChannelHandlerContext 提供的功能是统一管理这些ChannelHandler,使其能够和这个ChannelPipeline及其他Handler进行交互,一个handler可以往上流或者下流发送一个ChannelEvent,动态修改其所属的Channelpipeline。

充当链表节点的 DefaultChannelHandlerContext 里面的重要成员有: 链表指针next , prev, 以及是否能够处理downStream,upStream事件的布尔变量。

private final class DefaultChannelHandlerContext implements ChannelHandlerContext {

volatile DefaultChannelHandlerContext next;

volatile DefaultChannelHandlerContext prev;

private final String name ;

private final ChannelHandler handler;

private final boolean canHandleUpstream ;

private final boolean canHandleDownstream ;

private volatile Object attachment ;

DefaultChannelHandlerContext(

DefaultChannelHandlerContext prev, DefaultChannelHandlerContext next,

String name, ChannelHandler handler) {

if (name
== null) {

throw new NullPointerException( "name");

}

if (handler
== null) {

throw new NullPointerException( "handler");

}

canHandleUpstream =
handler instanceof ChannelUpstreamHandler;

canHandleDownstream =
handler instanceof ChannelDownstreamHandler;

if (!canHandleUpstream &&
! canHandleDownstream) {

throw new IllegalArgumentException(

"handler must be either " +

ChannelUpstreamHandlerclass.getName()
+ " or " +

ChannelDownstreamHandlerclass.getName()
+ ‘.‘);

}

this .prev =
prev;

this .next =
next;

this .name =
name;

this .handler =
handler;

}

public Channel getChannel()
{

return getPipeline().getChannel();

}

public ChannelPipeline getPipeline()
{

return DefaultChannelPipelinethis ;

}

public boolean canHandleDownstream()
{

return canHandleDownstream ;

}

public boolean canHandleUpstream()
{

return canHandleUpstream ;

}

public ChannelHandler getHandler()
{

return handler ;

}

public String
getName() {

return name ;

}

public Object
getAttachment() {

return attachment ;

}

public void setAttachment(Object
attachment) {

this .attachment =
attachment;

}

public void sendDownstream(ChannelEvent e)
{

DefaultChannelHandlerContext prev = getActualDownstreamContextthis. prev);

if (prev
== null) {

try {

getSink().eventSunk( DefaultChannelPipelinethis,
e);

catch (Throwable
t) {

notifyHandlerException(e, t);

}

else {

DefaultChannelPipelinethis.sendDownstream(prev,
e);

}

}

public void sendUpstream(ChannelEvent e)
{

DefaultChannelHandlerContext next = getActualUpstreamContextthis. next);

if (next
!= null) {

DefaultChannelPipelinethis.sendUpstream(next,
e);

}

}

}

ChannelHandler原理

时间: 2024-10-09 19:21:54

ChannelHandler原理的相关文章

nio原理/netty简单应用

一.非阻塞IO模式原理 与阻塞模式对应的另一种模式叫非阻塞IO模式,在整个通信过程中读和写操作不会阻塞,当前处理线程不存在阻塞情况.从A机器到B机器它的通信过程是:A机器一条线程将通道设置为写事件后往下执行,而另外一条线程遍历到此通道有字节要写并往socket写数据,B机器一条线程遍历到此通道有字节要读,交给另外一条线程对socket读数据,处理完又把通道设置为写事件,遍历线程遍历到此通道有字节要写,又往socket写数据传往A机器,不断往下循环此操作直到完成通信.这个过程每台机器都有两类主要线

Android 基于Netty的消息推送方案之概念和工作原理(二)

上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World.为了更好的理解Hello World中的代码,今天我来解说一下关于Netty中一些概念和工作原理的内容,假设你认为本篇文章有些枯燥.请先去阅读<Android 基于Netty的消息推送方案之Hello World(一)> ChannelEvent Netty是基于事件驱动的,就是我们上文提到的.发生什么事.就通知"有关部门". 所以.不难理解.我们自己的业务代码中,一定有跟这

原理剖析-Netty之服务端启动工作原理分析(下)

一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分析Netty的源码版本为:netty-netty-4.1.22.Final: 二.三.四章节请看上一章节 四.源码分析Netty服务端启动 上一章节,我们主要分析了一下线程管理组对象是如何被实例化的,并且还了解到了每个线程管理组都有一个子线程数组来处理任务: 那么接下来我们就直接从4.6开始分析了:

Dubbo原理和源码解析之服务暴露

一.框架设计 在官方<Dubbo 用户指南>架构部分,给出了服务调用的整体架构和流程: 另外,在官方<Dubbo 开发指南>框架设计部分,给出了整体设计: 以及暴露服务时序图: 本文将根据以上几张图,分析服务暴露的实现原理,并进行详细的代码跟踪与解析. 二.原理和源码解析 2.1 标签解析 从文章<Dubbo原理和源码解析之标签解析>中我们知道,<dubbo:service> 标签会被解析成 ServiceBean. ServiceBean 实现了 Init

dubbo源码福彩快三平台搭建分析22 -- consumer 发送与接收原理

在前面福彩快三平台搭建论坛:haozbbs.com Q1446595067的文章中,我们分析了 dubbo 从 provider 进行服务暴露,然后把服务信息注册到注册中心上面解耦 consumer 与 provider 的调用.consumer 通过 javassist 创建代理对象引用远程服务.当通过代理对象调用远程服务的时候,讲到进行真正调用的时候 dubbo 抽象出集群容错(Cluster.Directory.Router.LoadBalance)从服务多个暴露方选取出一个合适的 Inv

Dubbo 源码分析 - 自适应拓展原理

1.原理 我在上一篇文章中分析了 Dubbo 的 SPI 机制,Dubbo SPI 是 Dubbo 框架的核心.Dubbo 中的很多拓展都是通过 SPI 机制进行加载的,比如 Protocol.Cluster.LoadBalance 等.有时,有些拓展并非想在框架启动阶段被加载,而是希望在拓展方法被调用时,根据运行时参数进行加载.这听起来有些矛盾.拓展未被加载,那么拓展方法就无法被调用(静态方法除外).拓展方法未被调用,就无法进行加载,这似乎是个死结.不过好在也有相应的解决办法,通过代理模式就可

Netty(RPC高性能之道)原理剖析

1,Netty简述 Netty 是一个基于 JAVA NIO 类库的异步通信框架,用于创建异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性的网络客户端和服务器端 RPC高性能分析,请参考文章"[总结]RPC性能之道 " 特点 异步.非阻塞.基于事件驱动的NIO框架 支持多种传输层通信协议,包括TCP.UDP等 开发异步HTTP服务端和客户端应用程序 提供对多种应用层协议的支持,包括TCP私有协议.HTTP协议.WebSocket协议.文件传输等 默认提供多种编解码能力,包括Jav

【Netty】最透彻的Netty原理架构解析

这可能是目前最透彻的Netty原理架构解析 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目方面提供参考. Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. JDK 原生 NIO 程序的问题 JDK 原生也有一套网络应用程序 API,但是存在一系列问题,主要如下: NIO 的类库和 API 繁杂,使用麻烦.你需要熟练掌握 Selector.ServerSoc

新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析(阿里)

1.引言 Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目方面提供参考. 本文作者的另两篇<高性能网络编程(五):一文读懂高性能网络编程中的I/O模型>.<高性能网络编程(六):一文读懂高性能网络编程中的线程模型>也写的很好,有兴趣的读者可以一并看看. 关于作者: 陈彩华(