`
dwj147258
  • 浏览: 194777 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Nettty的handler执行顺序

阅读更多

Handler在netty中,无疑占据着非常重要的地位。Handler与Servlet中的filter很像,通过Handler可以完成通讯报文的解码编码、拦截指定的报文、统一对日志错误进行处理、统一对请求进行计数、控制Handler执行与否。一句话,没有它做不到的只有你想不到的。

Netty中的所有handler都实现自ChannelHandler接口。按照输出输出来分,分为ChannelInboundHandler、ChannelOutboundHandler两大类。ChannelInboundHandler对从客户端发往服务器的报文进行处理,一般用来执行解码、读取客户端数据、进行业务处理等;ChannelOutboundHandler对从服务器发往客户端的报文进行处理,一般用来进行编码、发送报文到客户端。

Netty中,可以注册多个handler。ChannelInboundHandler按照注册的先后顺序执行;ChannelOutboundHandler按照注册的先后顺序逆序执行,如下图所示,按照注册的先后顺序对Handler进行排序,request进入Netty后的执行顺序为:

 

 

先举一个例子吧

 bossGroup = new NioEventLoopGroup();
        workerGroup = new NioEventLoopGroup();
        try {
            //NIO服务的辅助启动类
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .option(ChannelOption.SO_BACKLOG, 128)
             .option(ChannelOption.SO_KEEPALIVE, true)
             .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000*60*5)
             .handler(new LoggingHandler(LogLevel.DEBUG))//设置父类handler
             .childHandler(new ChannelInitializer<SocketChannel>(){
                 @Override
                 protected void initChannel(SocketChannel socketChannel) throws Exception {
                     ChannelPipeline pipeline = socketChannel.pipeline();
                     pipeline.addLast("idleHandler",new TIdleHandler(AdapterParam.READIDLE, AdapterParam.WRITEIDLE,  AdapterParam.ALLIDLE));
                     //解码器
                     pipeline.addLast("decoder", new TDecoder());
                     //编码器
                     pipeline.addLast("encoder", new TEncoder());
                     //业务处理器
                     pipeline.addLast("handler", new THandler());
                 }
              });
            b.bind(port).sync();

 

这里加了四个handler两个outbound handler(idlehander , encoder)和两个inbound handler(decoder , handler)  添加顺序分别为:

idlehandler , decoder , encoder , handler , 

那么inbound的handler执行顺序,也就是收到消息的执行顺序为decoder , handler ,inbound执行顺序为先添加先执行

outbound的handler执行顺序,也就是发送消息的执行顺序为 encoder , idlehandler ,outbound的执行顺序为先添加的后执行

曾经遇到一个问题,在心跳监测中,也就是idlehandler中用ctx发送消息,发现对端接收不到,后来才发现,ctx.writeandflush方法是执行下一个handler,按照这个handler添加顺序,那么久不会执行encoder ,所以消息可能会发送不出去,但是用channel发送消息是重新跑一边所有的outbound handler也就是说会先执行encoder,这样才能将消息发送出去

0
0
分享到:
评论

相关推荐

    Netty4.0学习笔记系列之二:Handler的执行顺序

    在本篇“Netty4.0学习笔记系列之二:Handler的执行顺序”中,我们将深入探讨Netty中的Handler处理链以及它们的执行流程。 首先,Netty 中的 ChannelHandler 是处理 I/O 事件或拦截 I/O 操作的核心组件。每个 ...

    Android Handler消息处理顺序分析

    本文将详细分析Android Handler消息处理的顺序,以及如何利用这些组件进行异步操作。 首先,理解Handler的基本概念。Handler是Android中的一个类,用于发送和处理消息。它通常与Looper和Message配合工作,允许...

    jobHandler调度器

    在这个系统中,JobHandler是核心组件,它负责执行具体的业务逻辑。下面我们将详细探讨JobHandler调度器的工作原理、功能特性以及如何进行实际操作。 1. **工作原理**: JobHandler调度器采用中心式调度模型,通过...

    (word完整版)javascript看qq中多事件绑定的执行顺序.doc

    在不同的浏览器环境中,事件绑定的实现方式有所不同,导致了事件处理函数的执行顺序可能存在差异。本篇文章将深入探讨JavaScript在不同浏览器环境下,尤其是IE浏览器中,如何处理多事件绑定的执行顺序。 在W3C的...

    Android:Handler的post()方法和Thread的start()方法执行Thread的run()方法的区别

    * 此时只会会执行Run()方法,但是不会开启新的线程 */ //Handler h = new Handler(); //h.post(r); /* * 在java中真正开启线程的方法是这样的。 */ Thread t = new Thread(r); t.start(); ...

    Fragment与Activity使用Handler进行交互

    - **线程安全**:尽管Handler通常用于主线程,但在处理异步任务时,确保在正确的线程中执行操作,以免引发线程安全问题。 总结来说,Handler是Android中实现线程间通信的重要机制,它在Fragment和Activity的交互中...

    一个activity中多个handler和消息的处理过程

    首先,Handler是Android中的一个关键组件,它允许我们通过Message对象在不同的线程之间传递数据和执行任务。通常,我们在主线程(UI线程)中创建一个Handler实例,用于接收由其他工作线程发送的消息,并在适当的时间...

    Handler使用

    - **处理Message**:`Handler`接收到消息后,会调用`handleMessage()`方法来执行对应的任务,如更新UI等。 ### 3. Handler的使用 #### 3.1 发送消息 ```java // 创建Handler Handler handler = new Handler() { ...

    Handlerjava代码实现

    `Handler`、`Looper`和`Message`三者共同构成了Android的消息处理机制,帮助开发者在不同的线程之间传递数据和执行任务。现在,我们深入探讨`Handler`在Java中的实现。 `Handler`类的主要职责是接收和处理`Message`...

    handler用法

    首先,Handler的核心作用是在不同的线程间传递消息(Message)并执行相应的回调方法。在Android中,大部分UI操作必须在主线程(也称为UI线程)中进行,而网络请求、文件读写等耗时操作通常在子线程中执行。Handler...

    handler的简单示例

    在上述代码中,我们首先创建了一个主线程的Handler,然后在后台线程执行任务。任务完成后,我们创建一个Message,将结果封装在Bundle中,然后通过Handler的sendMessage()方法发送到主线程。当消息被Looper处理时,...

    handler post的方法demo

    `Handler`类主要用于发送和处理消息,`Thread`用于开启新的执行线程,而`post()`方法则是`Handler`的一个关键函数,常用于将一个Runnable对象放入消息队列,待UI线程空闲时执行。下面我们将深入探讨这些知识点。 ...

    线程,线程池与Handler的用法

    例如,固定大小线程池适合处理大量并发任务,而单线程池则保证任务顺序执行。通过线程池,我们可以避免频繁创建和销毁线程带来的开销,提高系统性能。 接下来是Handler,它是Android中处理线程间通信的核心工具。...

    Android_Handler详解(一)

    - **创建Handler对象**:首先在需要处理消息的线程(通常是主线程)中创建一个Handler实例,重写handleMessage()方法,这个方法会在接收到消息后被调用,用于执行相应的操作。 ```java class MyActivity extends ...

    android 中Handler 的几种写法

    在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI更新和事件处理的同步性。本文将详细介绍`Handler`的几种常见写法,以及如何使用`Handler.Callback`进行消息处理...

    Activity中的多个Handler处理机制

    `Handler`负责发送和处理消息,`Looper`是一个循环执行的线程,它不断地从`MessageQueue`中取出消息并交给相应的`Handler`处理。默认情况下,主线程(UI线程)已经有一个运行的`Looper`。 2. **创建多个Handler** ...

    模拟Android Handler机制Demo

    Handler的主要作用是将一个在非主线程(通常为工作线程)中产生的任务发送到主线程,以便在主线程中执行。这是因为Android的UI操作必须在主线程中进行。Handler通过发送Message对象到消息队列中,由Looper取出并分发...

    Handler和looper详解

    1. 执行计划任务:Handler可以执行计划任务,例如模拟定时器等。 2. 线程间通信:Handler可以实现线程间通信,在不同的线程中执行任务,并将结果返回到主线程中。 在Android系统中,Handler是通过Looper来实现消息...

Global site tag (gtag.js) - Google Analytics