查看文档,它是这样说的:
https://netty.io/4.0/api/io/netty/channel/ChannelPipeline.html
用户应该在管道中拥有一个或多个 ChannelHandler 来接收 I/O 事件(例如读)并请求 I/O 操作(例如写和关闭)。例如,典型的服务器将在每个通道的管道中具有以下处理程序,但您的里程可能会有所不同,具体取决于协议和业务逻辑的复杂性和特征:
协议解码器 - 将二进制数据(例如 ByteBuf)转换为 Java 对象。协议编码器 - 将 Java 对象转换为二进制数据。
业务逻辑处理程序 - 执行实际的业务逻辑(例如数据库访问)。它可以表示为以下示例所示: static Final EventExecutorGroup group = new DefaultEventExecutorGroup(16); ...
ChannelPipeline 管道 = ch.pipeline();
pipeline.addLast("解码器", new MyProtocolDecoder());
pipeline.addLast("编码器", new MyProtocolEncoder());
// 告诉管道在与 I/O 线程不同的线程中 // 运行 MyBusinessLogicHandler 的事件处理程序方法,以便 I/O 线程不会被 // 耗时的任务阻塞。// 如果您的业务逻辑是完全异步的或很快完成,则 // 不需要指定组。
pipeline.addLast(group, "handler", new MyBusinessLogicHandler());
在 Github 上的很多示例中我都看到了同样的模式。我想知道是否有人可以解释为什么businessHandler不在解码器和编码器之间。我认为您会获得 POJO,然后在业务处理程序中对其进行处理,然后对其进行编码。
由于处理程序的调用顺序,解码器和编码器通常位于管道的开头。对于传入数据,它是自下而上的;对于传出数据,它是自上而下的。
例如
pipeline.addLast(new MyEncoder());
pipeline.addLast(new MyDecoder());
pipeline.addLast(new MyBusiness());
Run Code Online (Sandbox Code Playgroud)
在这种情况下,对于传入数据调用顺序是:MyDecoder(将数据转换为 POJO)-> MyBusiness(对于传入流不调用编码器),对于传出数据:MyBusiness -> MyEncoder(对于传出流不调用解码器) 。
如果您在业务处理程序(实际上是解码器之后的 POJO)中收到传入流,对其进行处理并将其写回,则看起来 MyBusiness 位于编码器和解码器之间,因为数据正在返回到编码器。