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, writeAndFlush
ChannelPipeline 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.