public interface ChannelPipeline extends ChannelInboundInvoker, ChannelOutboundInvoker, java.lang.Iterable<java.util.Map.Entry<java.lang.String,ChannelHandler>>
Channel的入站事件和出站操作的ChannelHandler列表 。
ChannelPipeline实现了Intercepting Filter模式的高级形式,以便用户完全控制事件处理方式以及管道中的ChannelHandler如何相互交互。
ChannelHandler个 S IN一个ChannelPipeline典型。
I / O事件由ChannelInboundHandler或ChannelOutboundHandler处理,并通过调用ChannelHandlerContext中定义的事件传播方法(如ChannelHandlerContext.fireChannelRead(Object)和ChannelOutboundInvoker.write(Object))转发给其最近的处理程序。
I/O Request
via Channel or
ChannelHandlerContext
|
+---------------------------------------------------+---------------+
| ChannelPipeline | |
| \|/ |
| +---------------------+ +-----------+----------+ |
| | Inbound Handler N | | Outbound Handler 1 | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
| | \|/ |
| +----------+----------+ +-----------+----------+ |
| | Inbound Handler N-1 | | Outbound Handler 2 | |
| +----------+----------+ +-----------+----------+ |
| /|\ . |
| . . |
| ChannelHandlerContext.fireIN_EVT() ChannelHandlerContext.OUT_EVT()|
| [ method call] [method call] |
| . . |
| . \|/ |
| +----------+----------+ +-----------+----------+ |
| | Inbound Handler 2 | | Outbound Handler M-1 | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
| | \|/ |
| +----------+----------+ +-----------+----------+ |
| | Inbound Handler 1 | | Outbound Handler M | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
+---------------+-----------------------------------+---------------+
| \|/
+---------------+-----------------------------------+---------------+
| | | |
| [ Socket.read() ] [ Socket.write() ] |
| |
| Netty Internal I/O Threads (Transport Implementation) |
+-------------------------------------------------------------------+
入站事件由入站处理程序以自下而上的方向处理,如图左侧所示。
入站处理程序通常处理由图底部的I / O线程生成的入站数据。
入站数据通常通过实际的输入操作(如SocketChannel.read(ByteBuffer)从远程对等端SocketChannel.read(ByteBuffer) 。
如果入站事件超出顶层入站处理程序,它将被静默放弃,或者在需要您关注时进行记录。
一个出站事件由出站处理程序在自上而下的方向进行处理,如图右侧所示。 出站处理程序通常会生成或转换出站流量,如写入请求。 如果出站事件超出底部出站处理程序,则由与Channel关联的I / O线程处理。 I / O线程经常执行实际的输出操作,例如SocketChannel.write(ByteBuffer) 。
例如,让我们假设我们创建了以下管道:
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());
在上面的示例中,名称以Inbound开头的类表示它是入站处理程序。
名称以Outbound开头的类表示它是出站处理程序。
在给定的示例配置中,当事件进入时,处理程序评估顺序为1,2,3,4,5。 当事件出站时,顺序为5,4,3,2,1。除此原则之外, ChannelPipeline跳过某些处理程序的评估以缩短堆栈深度:
ChannelInboundHandler ,因此入站事件的实际评估顺序将为:1,2和5。 ChannelOutboundHandler ,因此出站事件的实际评估顺序为: 5,4和3。 ChannelInboundHandler和ChannelOutboundHandler ,则入站和出站事件的评估顺序可分别为125和543。 ChannelHandlerContext中的事件传播方法才能将事件转发到其下一个处理程序。
这些方法包括:
ChannelHandlerContext.fireChannelRegistered() ChannelHandlerContext.fireChannelActive() ChannelHandlerContext.fireChannelRead(Object) ChannelHandlerContext.fireChannelReadComplete() ChannelHandlerContext.fireExceptionCaught(Throwable) ChannelHandlerContext.fireUserEventTriggered(Object) ChannelHandlerContext.fireChannelWritabilityChanged() ChannelHandlerContext.fireChannelInactive() ChannelHandlerContext.fireChannelUnregistered() ChannelOutboundInvoker.bind(SocketAddress, ChannelPromise) ChannelOutboundInvoker.connect(SocketAddress, SocketAddress, ChannelPromise) ChannelOutboundInvoker.write(Object, ChannelPromise) ChannelHandlerContext.flush() ChannelHandlerContext.read() ChannelOutboundInvoker.disconnect(ChannelPromise) ChannelOutboundInvoker.close(ChannelPromise) ChannelOutboundInvoker.deregister(ChannelPromise) public class MyInboundHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(ChannelHandlerContext ctx) {
System.out.println("Connected!");
ctx.fireChannelActive();
}
}
public class MyOutboundHandler extends ChannelOutboundHandlerAdapter {
@Override
public void close(ChannelHandlerContext ctx, ChannelPromise promise) {
System.out.println("Closing ..");
ctx.close(promise);
}
}
用户应该在流水线中拥有一个或多个ChannelHandler以接收I / O事件(例如读取)并请求I / O操作(例如写入和关闭)。 例如,一个典型的服务器在每个通道的管道中都会有以下处理程序,但是您的里程可能会因协议和业务逻辑的复杂性和特征而异:
ByteBuf )转换为Java对象。 static final EventExecutorGroup group = new DefaultEventExecutorGroup(16);
...
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("decoder", new MyProtocolDecoder());
pipeline.addLast("encoder", new MyProtocolEncoder());
// Tell the pipeline to run MyBusinessLogicHandler's event handler methods
// in a different thread than an I/O thread so that the I/O thread is not blocked by
// a time-consuming task.
// If your business logic is fully asynchronous or finished very quickly, you don't
// need to specify a group.
pipeline.addLast(group, "handler", new MyBusinessLogicHandler());
ChannelHandler可随时添加或删除,因为ChannelPipeline是线程安全的。 例如,您可以在敏感信息即将交换时插入加密处理程序,并在交换后将其删除。
bind, bind, close, close, connect, connect, connect, connect, deregister, deregister, disconnect, disconnect, newFailedFuture, newProgressivePromise, newPromise, newSucceededFuture, read, voidPromise, write, write, writeAndFlush, writeAndFlushChannelPipeline addFirst(java.lang.String name, ChannelHandler handler)
ChannelHandler 。
name - 首先插入的处理程序的名称
handler - 首先插入的处理程序
java.lang.IllegalArgumentException - 如果管道中已存在具有相同名称的条目
java.lang.NullPointerException - 如果指定的处理程序是
null
ChannelPipeline addFirst(EventExecutorGroup group, java.lang.String name, ChannelHandler handler)
ChannelHandler 。
group -所述EventExecutorGroup ,其将被用于执行所述ChannelHandler种方法
name - 首先插入的处理程序的名称
handler - 首先插入的处理程序
java.lang.IllegalArgumentException - 如果管道中已存在具有相同名称的条目
java.lang.NullPointerException - 如果指定的处理程序是
null
ChannelPipeline addLast(java.lang.String name, ChannelHandler handler)
ChannelHandler 。
name - 要附加的处理程序的名称
handler - 要附加的处理程序
java.lang.IllegalArgumentException - 如果管道中已存在具有相同名称的条目
java.lang.NullPointerException - 如果指定的处理程序是
null
ChannelPipeline addLast(EventExecutorGroup group, java.lang.String name, ChannelHandler handler)
ChannelHandler 。
group -所述EventExecutorGroup ,其将被用于执行所述ChannelHandler种方法
name - 要附加的处理程序的名称
handler - 要附加的处理程序
java.lang.IllegalArgumentException - 如果管道中已存在具有相同名称的条目
java.lang.NullPointerException - 如果指定的处理程序是
null
ChannelPipeline addBefore(java.lang.String baseName, java.lang.String name, ChannelHandler handler)
ChannelHandler 。
baseName - 现有处理程序的名称
name - 之前要插入的处理程序的名称
handler - 之前插入的处理程序
java.util.NoSuchElementException - 如果没有指定的
baseName这样的条目
java.lang.IllegalArgumentException - 如果管道中已存在具有相同名称的条目
java.lang.NullPointerException - 如果指定的baseName或handler是
null
ChannelPipeline addBefore(EventExecutorGroup group, java.lang.String baseName, java.lang.String name, ChannelHandler handler)
ChannelHandler 。
group -所述EventExecutorGroup ,其将被用于执行所述ChannelHandler种方法
baseName - 现有处理程序的名称
name - 之前要插入的处理程序的名称
handler - 之前插入的处理程序
java.util.NoSuchElementException - 如果没有指定的
baseName这样的条目
java.lang.IllegalArgumentException - 如果管道中已存在具有相同名称的条目
java.lang.NullPointerException - 如果指定的baseName或处理程序是
null
ChannelPipeline addAfter(java.lang.String baseName, java.lang.String name, ChannelHandler handler)
ChannelHandler 。
baseName - 现有处理程序的名称
name - 要插入的处理程序的名称
handler - 之后插入的处理程序
java.util.NoSuchElementException - 如果没有指定的
baseName这样的条目
java.lang.IllegalArgumentException - 如果管道中已存在具有相同名称的条目
java.lang.NullPointerException - 如果指定的baseName或处理程序是
null
ChannelPipeline addAfter(EventExecutorGroup group, java.lang.String baseName, java.lang.String name, ChannelHandler handler)
ChannelHandler 。
group -所述EventExecutorGroup ,其将被用于执行所述ChannelHandler种方法
baseName - 现有处理程序的名称
name - 要插入的处理程序的名称
handler - 要插入的处理程序
java.util.NoSuchElementException - 如果没有指定的
baseName这样的条目
java.lang.IllegalArgumentException - 如果管道中已存在具有相同名称的条目
java.lang.NullPointerException - 如果指定的baseName或handler是
null
ChannelPipeline addFirst(ChannelHandler... handlers)
ChannelHandler s。
handlers - 首先插入的处理程序
ChannelPipeline addFirst(EventExecutorGroup group, ChannelHandler... handlers)
ChannelHandler s。
group -所述EventExecutorGroup ,其将被用于执行所述ChannelHandler小号方法。
handlers - 首先插入的处理程序
ChannelPipeline addLast(ChannelHandler... handlers)
ChannelHandler s。
handlers - 最后插入的处理程序
ChannelPipeline addLast(EventExecutorGroup group, ChannelHandler... handlers)
ChannelHandler s。
group -所述EventExecutorGroup ,其将被用于执行所述ChannelHandler小号方法。
handlers - 最后插入的处理程序
ChannelPipeline remove(ChannelHandler handler)
ChannelHandler 。
handler - 将ChannelHandler删除
java.util.NoSuchElementException - 如果在此管道中没有这样的处理程序
java.lang.NullPointerException - 如果指定的处理程序是
null
ChannelHandler remove(java.lang.String name)
ChannelHandler 。
name -在其名称ChannelHandler储存。
java.util.NoSuchElementException - 如果在此管道中不存在具有指定名称的此类处理程序
java.lang.NullPointerException - 如果指定的名称是
null
<T extends ChannelHandler> T remove(java.lang.Class<T> handlerType)
ChannelHandler 。
T - 处理程序的类型
handlerType - 处理程序的类型
java.util.NoSuchElementException - 如果在此管道中没有指定类型的此类处理程序
java.lang.NullPointerException - 如果指定的处理程序类型是
null
ChannelHandler removeFirst()
ChannelHandler 。
java.util.NoSuchElementException - 如果此管道是空的
ChannelHandler removeLast()
ChannelHandler 。
java.util.NoSuchElementException - 如果此管道是空的
ChannelPipeline replace(ChannelHandler oldHandler, java.lang.String newName, ChannelHandler newHandler)
ChannelHandler 。
oldHandler - 将被替换的ChannelHandler
newName - 应该添加替换的名称
newHandler - 用作替换的ChannelHandler
java.util.NoSuchElementException - 如果指定的旧处理程序不存在于此管道中
java.lang.IllegalArgumentException - 如果具有指定新名称的处理程序已存在于此管道中,除了要替换的处理程序
java.lang.NullPointerException - 如果指定的旧处理程序或新处理程序是
null
ChannelHandler replace(java.lang.String oldName, java.lang.String newName, ChannelHandler newHandler)
ChannelHandler 。
oldName - 要替换的ChannelHandler的名称
newName - 应该添加替换的名称
newHandler - 用作替换的ChannelHandler
java.util.NoSuchElementException - 如果具有指定旧名称的处理程序在此管道中不存在
java.lang.IllegalArgumentException - 如果具有指定新名称的处理程序已经存在于此管道中,除了要替换的处理程序
java.lang.NullPointerException - 如果指定的旧处理程序或新处理程序是
null
<T extends ChannelHandler> T replace(java.lang.Class<T> oldHandlerType, java.lang.String newName, ChannelHandler newHandler)
ChannelHandler 。
oldHandlerType - 要移除的处理程序的类型
newName - 应该添加替换的名称
newHandler - 用作替换的ChannelHandler
java.util.NoSuchElementException - 如果指定的旧处理程序类型的处理程序不存在于此管道中
java.lang.IllegalArgumentException - 如果具有指定新名称的处理程序已经存在于此管道中,除了要替换的处理程序
java.lang.NullPointerException - 如果指定的旧处理程序或新处理程序是
null
ChannelHandler first()
ChannelHandler 。
null如果此管道是空的。
ChannelHandlerContext firstContext()
ChannelHandler的上下文。
null如果此管道是空的。
ChannelHandler last()
ChannelHandler 。
null如果这条管道是空的。
ChannelHandlerContext lastContext()
ChannelHandler的上下文。
null如果此管道是空的。
ChannelHandler get(java.lang.String name)
ChannelHandler 。
null如果在这个管道中没有这样的处理程序。
<T extends ChannelHandler> T get(java.lang.Class<T> handlerType)
ChannelHandler 。
null如果在这个管道中没有这样的处理程序。
ChannelHandlerContext context(ChannelHandler handler)
ChannelHandler的上下文对象。
null如果在这个管道中没有这样的处理程序。
ChannelHandlerContext context(java.lang.String name)
ChannelHandler的上下文对象。
null如果在这个管道中没有这样的处理程序。
ChannelHandlerContext context(java.lang.Class<? extends ChannelHandler> handlerType)
ChannelHandler的上下文对象。
null如果在这个管道中没有这样的处理程序。
java.util.List<java.lang.String> names()
List 。
java.util.Map<java.lang.String,ChannelHandler> toMap()
Map其键为处理程序名称,其值为处理程序。
ChannelPipeline fireChannelRegistered()
ChannelInboundInvoker
Channel已注册到其EventLoop 。
这将导致在具有ChannelInboundHandler.channelRegistered(ChannelHandlerContext)方法称为下一个的ChannelInboundHandler包含在ChannelPipeline的的Channel 。
fireChannelRegistered ,界面
ChannelInboundInvoker
ChannelPipeline fireChannelUnregistered()
ChannelInboundInvoker
Channel从其EventLoop未注册。
这将导致在具有ChannelInboundHandler.channelUnregistered(ChannelHandlerContext)方法称为下一个的ChannelInboundHandler包含在ChannelPipeline的的Channel 。
fireChannelUnregistered接口
ChannelInboundInvoker
ChannelPipeline fireChannelActive()
ChannelInboundInvoker
Channel现在处于活动状态,这意味着它已连接。
这将导致在具有ChannelInboundHandler.channelActive(ChannelHandlerContext)方法称为下一个的ChannelInboundHandler包含在ChannelPipeline的的Channel 。
fireChannelActive在界面
ChannelInboundInvoker
ChannelPipeline fireChannelInactive()
ChannelInboundInvoker复制的描述
Channel现在不活动,这意味着它已关闭。
这将导致在具有ChannelInboundHandler.channelInactive(ChannelHandlerContext)方法称为下一个的ChannelInboundHandler包含在ChannelPipeline的的Channel 。
fireChannelInactive接口
ChannelInboundInvoker
ChannelPipeline fireExceptionCaught(java.lang.Throwable cause)
ChannelInboundInvoker
Channel在其一项入境业务中收到Throwable 。
这将导致在具有ChannelInboundHandler.exceptionCaught(ChannelHandlerContext, Throwable)方法称为下一个的ChannelInboundHandler包含在ChannelPipeline的的Channel 。
fireExceptionCaught接口
ChannelInboundInvoker
ChannelPipeline fireUserEventTriggered(java.lang.Object event)
ChannelInboundInvoker复制的描述
Channel收到用户定义的事件。
这将导致在具有ChannelInboundHandler.userEventTriggered(ChannelHandlerContext, Object)方法称为下一个的ChannelInboundHandler包含在ChannelPipeline的的Channel 。
fireUserEventTriggered接口
ChannelInboundInvoker
ChannelPipeline fireChannelRead(java.lang.Object msg)
ChannelInboundInvoker
Channel收到消息。
这将导致在具有ChannelInboundHandler.channelRead(ChannelHandlerContext, Object)方法称为下一个的ChannelInboundHandler包含在ChannelPipeline的的Channel 。
fireChannelRead在界面
ChannelInboundInvoker
ChannelPipeline fireChannelReadComplete()
ChannelInboundInvoker
ChannelInboundHandler.channelReadComplete(ChannelHandlerContext)事件到下一个ChannelInboundHandler在ChannelPipeline 。
fireChannelReadComplete接口
ChannelInboundInvoker
ChannelPipeline fireChannelWritabilityChanged()
ChannelInboundInvoker
ChannelInboundHandler.channelWritabilityChanged(ChannelHandlerContext)事件到ChannelPipeline中的下一个ChannelInboundHandler 。
fireChannelWritabilityChanged接口
ChannelInboundInvoker
ChannelPipeline flush()
ChannelOutboundInvoker复制的描述
flush接口
ChannelOutboundInvoker
Copyright © 2008–2018 The Netty Project. All rights reserved.