6.1 ChannelPipeline

ChannelPipeline是处理或拦截通道的入站和出站操作的ChannelHandler实例的列表。ChannelPipeline提供了一种高级形式的拦截过滤器模式使用户可以完全控制事件的处理方式以及ChannelPipeline中的ChannelHandlers如何进行交互。

对于每个新channel,都会创建一个新的ChannelPipeline并将其附加到该channel。连接后,通道与ChannelPipeline之间的耦合是永久的;该通道无法将另一个ChannelPipeline附加到该通道或从其分离当前ChannelPipeline。所有这些都为您处理;您不需要关心这些。

图6.1描述了ChannelPipeline中的ChannelHandlers通常如何处理I / O。I / O操作可由ChannelInboundHandler或ChannelOutboundHandler处理并通过调用ChannelInboundInvoker接口中定义的方法之一(用于入站I / O)或通过ChannelOutboundInvoker接口中定义的方法之一(用于出站I / O)转发到最近的处理程序。ChannelPipeline扩展了它们两者。

Figure 6.1 ChannelPipeline

如图6.1所示,ChannelPipeline主要是ChannelHandlers的列表。如果触发了入站I / O事件,则将其从ChannelPipeline的开头传递到结尾。对于出站I / O事件,它从ChannelPipeline的末尾开始,一直到开始。ChannelPipeline本身通过检查其类型知道ChannelHandler是否可以处理事件。如果无法处理,则跳过ChannelHandler并使用下一个匹配项。

ChannelPipeline上的修改可以即时完成,这意味着您甚至可以在另一个ChannelHandler中添加/删除/替换ChannelHandler或将其删除。这样可以编写灵活的逻辑,例如多路复用器,但是我将在本章后面详细介绍。现在,让我们看一下如何修改ChannelPipeline。

Table 6.1 Methods to modify a ChannelPipeline

正如您所看到的,修改通道管道是很容易的,并且允许您按需添加、删除、替换通道处理程序。

ChannelHandler execution and blocking

通常,添加到ChannelPipeline的每个ChannelHandler都会处理在IO线程中通过它传递的事件,这意味着您不得阻塞,否则将阻塞IO线程,从而影响IO的整体处理。

有时需要阻塞,因为您可能需要使用仅提供阻塞API的旧版API。例如,对于JDBC来说就是这样。确切地说,此用例Netty允许将EventExecutorGroup传递给每个ChannelPipeline.add *方法。如果在事件中传递了自定义EventExecutorGroup,则将由此EventExecutorGroup中包含的EventExecutor中的一个处理事件,并进行移动。Netty附带了一个称为DefaultEventExecutorGroup的默认实现。

除了允许您修改ChannelPipeline的操作之外,还有一些操作可让您访问ChannelHandler实现添加的内容,以及检查ChannelPipeline中是否存在特定的ChannelHandler。

当Channel管道扩展ChannelInboundInvoker和ChannelOutboundInvoker时,它公开了调用入站和出站操作的其他方法。

表6.3列出了ChannelInboundInvoker接口中定义的所有公开的入站操作。除ChannelPipeline之外,ChannelHandlerContext还扩展ChannelInboundInvoker并公开这些内容。

最后更新于

这有帮助吗?