首页  

netty Event Handler 和 Pipeline     所属分类 netty 浏览量 75
pipeLine  Channel  handler  
filter 过滤器 拦截器 

channel 创建时,和它对应的ChannelPipeline也会被创建

public interface ChannelPipeline 
extends ChannelInboundInvoker, ChannelOutboundInvoker, Iterable< Map.Entry< String, ChannelHandler>>


ChannelPipeline 继承自 Iterable,可遍历的
ChannelPipeline提供了一系列的add和remote方法 ,添加或移除 Handler
filter 顺序 , addFirst 和 addLast

两种操作, 读入 Inbound, 写出 OutBound
Inbound和outbound的处理顺序是相反的

ChannelPipeline p = ...;
p.addLast("1", new InboundHandlerA());
p.addLast("2", new InboundHandlerB());
p.addLast("3", new OutboundHandlerA());
p.addLast("4", new OutboundHandlerB());
p.addLast("5", new InboundOutboundHandlerX());

向ChannelPipeline添加了5个handler,其中2个InboundHandler,2个OutboundHandler和一个同时处理In和Out的Handler

发生 inbound 事件时  执行顺序 1,2,5
发生 outbound 事件时  执行顺序 5,4,3



ChannelHandler netty 事件驱动 ,所有的event都由Handler来处理 ChannelHandler 可以处理IO、拦截IO或者将event传递给ChannelPipeline中的下一个Handler处理 ChannelHandler 只有三个方法 void handlerAdded(ChannelHandlerContext ctx) throws Exception; void handlerRemoved(ChannelHandlerContext ctx) throws Exception; void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception; ChannelHandler 分为两类, ChannelInboundHandler 和 ChannelOutboundHandler ChannelInboundHandlerAdapter ChannelOutboundHandlerAdapter ChannelDuplexHandler ChannelHandler ChannelHandlerContext ChannelPipeline ChannelHandlerContext channel() 获取绑定的channel handler() 获取绑定的Handler fire*方法 触发Channel的事件 public interface ChannelHandlerContext extends AttributeMap, ChannelInboundInvoker, ChannelOutboundInvoker 触发和传播事件 对于 Inbound ,传播事件的方法有: ChannelHandlerContext.fireChannelRegistered() ChannelHandlerContext.fireChannelActive() ChannelHandlerContext.fireChannelRead(Object) ChannelHandlerContext.fireChannelReadComplete() ChannelHandlerContext.fireExceptionCaught(Throwable) ChannelHandlerContext.fireUserEventTriggered(Object) ChannelHandlerContext.fireChannelWritabilityChanged() ChannelHandlerContext.fireChannelInactive() ChannelHandlerContext.fireChannelUnregistered() 对于 Outbound ,传播事件的方法有: ChannelHandlerContext.bind(SocketAddress, ChannelPromise) ChannelHandlerContext.connect(SocketAddress, SocketAddress, ChannelPromise) ChannelHandlerContext.write(Object, ChannelPromise) ChannelHandlerContext.flush() ChannelHandlerContext.read() ChannelHandlerContext.disconnect(ChannelPromise) ChannelHandlerContext.close(ChannelPromise) ChannelHandlerContext.deregister(ChannelPromise) 这些方法,在一个Handler中调用,然后将事件传递给下一个Handler public class ChannelInboundHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println("connected"); ctx.fireChannelActive(); } }
ChannelHandler中的状态变量 private final AttributeKey< Boolean> auth = AttributeKey.valueOf("auth"); Attribute< Boolean> attr = ctx.attr(auth); attr.set(true); ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast("MyHandler1", new MyHandler1()); pipeline.addLast("MyHandler2", new MyHandler2()); pipeline.addLast("MyHandler3", new MyHandler3()); static final EventExecutorGroup group = new DefaultEventExecutorGroup(16); pipeline.addLast(group,"MyHandler3", new MyHandler3()); DefaultEventExecutorGroup 加入的 Handler 会顺序执行的 如果确实不想顺序执行,可以尝试考虑使用 UnorderedThreadPoolEventExecutor

上一篇     下一篇
Netty EventLoop

netty VS mina

热锅冷油,炒菜不粘锅的科学原理

netty中的设计模式

Java类命名建议

中证A500指数