4 - Channelhandler和ChannelPipeline
4.1 Channelhandler
4.1.1 Channel声明周期(状态事件)
方法 | 描述 |
---|---|
ChannelUnregistered | Channnel已创建,但是未注册到EventLoop |
ChannelRegistered | Channnel已注册到EventLoop |
ChannelActive | Channnel活动状态(已连接到远程节点),可以发送接收数据 |
ChannelInactive | Channnel未连接到远程站点 |
4.1.2 Channelhandler生命周期(状态事件)
从channelPipeLine中添加删除时触发
方法 | 描述 |
---|---|
handlerAdded | 当把handler添加到channelPipieLine中时 |
handlerRemoved | 从pipeLine中移除时 |
exceptionCaught | handler处理过程中异常时调用 |
4.1.3 ChannelInBoundHandler接口--入站数据及状态变化
ChannelInBoundHandlerAdapter--调用read后如果不继续调用ctx.fireChannelRead(msg)将消息传给下一个channel(即丢弃消息),则需要手动释放(ReferenceCountutil.release(msg))
SimpleChannelInBoundHandler -- 已封装,自动释放资源
方法 | 描述 |
---|---|
channelRead | 从channel中读取数据时 |
channelReadComplete | 所有数据都已从Channel中读取之后调用(可能之前channelRead已多次调用) |
userEventTriggered | 当ChannelInBoundHandler.fireuserEventTriggered()被调用时触发 |
4.1.3 ChannelOutBoundHandler 接口--出站数据及拦截操作
a). 可按需推迟操作或者事件.
b). 方法被channel、channelPipeLine及channelHandlerContext调用
方法 | 描述 |
---|---|
bind | |
connect | |
disconnect | |
close | |
deregister | |
read(ChannelhandlerContext) | 当请求从channel读取数据时调用 |
flush | 写数据到远端 |
write | write后不传递消息时需要手动释放,ReferenceCountutil.release(msg);promise.setSuccess(); |
4.2 ChannelPipeLine-channelhandler实例链
a). 可动态修改
b). fireChannelread之类方法都是调用ChannelPipeLine中下一个handler中对应方法.
方法 | 描述 |
---|---|
addFist | |
addBefore | |
addAfter | |
addlast | |
remove | |
replace | 以上都是处理内部channelHandler的方法 |
4.3 ChannelHandlerContext接口-handler和pipeLine之间的连接
4.4 异常处理
4.4.1 入站异常
a). 异常从出发的那一点开始流经pipiLine
b). exceptionCaught默认实现是将异常转发下一个handler处理
c). 如果到达尾部还未处理则被记录为未处理
public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf>{
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){
cause.printStackTrace();
ctx.close();
}
}
4.4.2 出站异常
a). 每个出站操作都返回一个ChannelFuture
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise){
promise.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if( !future.isSuccess() ){
future.cause().printStackTrace();
future.channel().close();
}
}
})
}
4 - Channelhandler和ChannelPipeline的更多相关文章
- 【Netty】ChannelHandler和ChannelPipeline
一.前言 前面学习了Netty的ByteBuf,接着学习ChannelHandler和ChannelPipeline. 二.ChannelHandler和ChannelPipeline 2.1 Cha ...
- Netty实战六之ChannelHandler和ChannelPipeline
1.Channel的生命周期 Interface Channel定义了一组和ChannelInboundHandler API密切相关的简单但功能强大的状态模型,以下列出Channel的4个状态. C ...
- Netty 系列四(ChannelHandler 和 ChannelPipeline).
一.概念 先来整体的介绍一下这篇博文要介绍的几个概念(Channel.ChannelHandler.ChannelPipeline.ChannelHandlerContext.ChannelPromi ...
- netty中的ChannelHandler和ChannelPipeline
netty中的ChannelHandler和ChannelPipeline ChannelHandler 家族 https://www.w3cschool.cn/essential_netty_in_ ...
- Netty的ChannelHandler,ChannelHandlerContext,ChannelPipeline
本小节一起学习一下ChannelHandler,ChannelHandlerContext,ChannelPipeline这三个Netty常用的组件,不探究它们的底层源码,我们就简单的分析一下用法 首 ...
- ChannelHandler,ChannelHandlerContext,ChannelPipeline
本小节一起学习一下ChannelHandler,ChannelHandlerContext,ChannelPipeline这三个Netty常用的组件,不探究它们的底层源码,我们就简单的分析一下用法 首 ...
- Netty学习笔记(番外篇) - ChannelHandler、ChannelPipeline和ChannelHandlerContext的联系
这一篇是 ChannelHandler 和 ChannelPipeline 的番外篇,主要从源码的角度来学习 ChannelHandler.ChannelHandler 和 ChannelPipeli ...
- Netty 框架学习 —— ChannelHandler 与 ChannelPipeline
ChannelHandler 1. Channel 生命周期 Channel 的生命周期状态如下: 状态 描述 ChannelUnregistered Channel 已经被创建,但还未注册到 Eve ...
- Netty学习摘记 —— 再谈ChannelHandler和ChannelPipeline
本文参考 本篇文章是对<Netty In Action>一书第六章"ChannelHandler和ChannelPipeline",主要内容为ChannelHandle ...
随机推荐
- 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView
目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...
- [MySQL]关于Com_状态
MySQL 5.5官方文档: http://dev.mysql.com/doc/refman/5.5/en/server-status-variables.html#statvar_Com_xxx C ...
- "LPWSTR" 类型的实参与"const.char *"类型形参不兼容
CString csPlus; CString csSummand; m_PlusNumber.GetWindowTextW(csPlus); m_Summand.GetWindowTextW(csS ...
- 18_andriod常用布局&内容回顾
线性布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:androi ...
- [hdu2159]FATE二维多重背包(背包九讲练习)
解题关键:二维约束条件,只需加一维状态即可. 转移方程:$f[j][k] = \max (f[j][k],f[j - w[i]][k - 1] + v[i])$ #include<bits/st ...
- CodeForces 1107F. Vasya and Endless Credits
题目简述:给定 $n \leq 500$ 个贷款方式,其中第$i$个贷款额为$a_i$元,需要$k_i$个月偿还,每月还贷$b_i$元.在每个月月初可申请其中一个贷款,而在每个月月底时需要还贷.求:( ...
- hdu1073
#include<iostream> using namespace std; #define N 5050 char a[N],b[N],tmp[N]; void Read(char p ...
- [CentOS7] at, bash, cron, anacron
声明:本文主要总结自:鸟哥的Linux私房菜-第十五章.例行性工作排程(crontab),如有侵权,请通知博主 at => /var/spool/at /etc/at.allow, /etc/a ...
- 2018上海大都会邀请赛J(数位DP)
#include<bits/stdc++.h>using namespace std;int num[20];//按位储存数字int mod;long long dp[20][110][1 ...
- Trie[字典树] 数据结构及基本操作集
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm&g ...