MQTT---HiveMQ源码详解(五)Netty-启动与Listeners加载

实现功能

启动netty,按照用户配置的Listener进行端口的监听,接受客户端发来的链接

实现步骤

1、启动netty

2、通过ListenerConfigurationService获得到用户的Listener配置,将对应的配置绑定到netty上。

类图

这个uml熟悉netty的朋友应该看起来很清晰,下来我们帖几段代码,来看hivemq是如何绑定的。


public ListenableFuture<List<ListenerStartResult>> startListeners() {
//为netty注册Shutdown,为了使netty主线程在关闭时,能够关闭掉worker和boss
        this.shutdownRegistry.register(new NettyShutdown(this.childEventLoop, this.parentEventLoop, this.hiveMQConfigurationService.internalConfiguration().getInt(Internals.EVENT_LOOP_GROUP_SHUTDOWN_TIMEOUT)));
        //记录Listener启动的结果的Future列表,方便在日志/控制台中打印出Listener绑定的结果。
        List<ListenerStartFuture> startFutures = new ArrayList<>();
        //如果用户未配置Listener,那么将默认添加一个绑定到1883端口TcpListener
        addDefaultListenerWhenListenersIsEmpty();
//从用户配置中获得到TcpListeners绑定到netty上
startFutures.addAll(startTcpListeners(this.listenerConfigurationService.getTcpListeners()));
//从用户配置中获得到TlsTcpListeners绑定到netty上
startFutures.addAll(startTlsTcpListeners(this.listenerConfigurationService.getTlsTcpListeners()));
//从用户配置中获得到WebsocketListeners绑定到netty上
startFutures.addAll(startWebsocketListeners(this.listenerConfigurationService.getWebsocketListeners()));
//从用户配置中获得到TlsWebsocketListeners绑定到netty上
startFutures.addAll(startTlsWebsocketListeners(this.listenerConfigurationService.getTlsWebsocketListeners()));
//将一堆启动的Future转换成一个Future,让调用者(HiveMQServer)方便使用。
        return getStartResult(startFutures);
    }

由上面的过程可以知道,具体代码处理流程

1、由HiveMQServer,调用NettyServer的start,启动netty。

2、然后再调用startListeners,将配置的Listeners绑定到netty上


MQTT交流群:221405150


时间: 2024-10-18 08:03:53

MQTT---HiveMQ源码详解(五)Netty-启动与Listeners加载的相关文章

Spark 1.6 RPC内幕解密:运行机制、源码详解、Netty与Akka等(DT大数据梦工厂)

内容: 1.Spark 1.6 RPC解析: 2.RPCEnv源码解析: 3.RPCEndpoint等源码解析: 以前和现在的RPC都是采用Akka,以前和现在的不同就在于RPCEnv,现在就是基于RPCEnv去做RPC通信的 ==========Spark 1.6 RPC解析============ 1.Spark 1.6推出了以RPCEnv.RPCEndpoint.RPCEndpointRef为核心的新型架构下的RPC通信方式,就目前的实现而言,其底层依旧是Akka: 2.Akka是基于Sc

第43课:Spark 1.6 RPC内幕解密:运行机制、源码详解、Netty与Akka等

Spark 是分布式计算框架,多台机器之间必然存在着通信.Spark在早期版本采用Akka实现.现在在Akka的上层抽象出了一个RpcEnv.RpcEnv负责管理机器之间的通信. RpcEnv包含了如下三大核心: RpcEndpoint 消息循环体,负责接收并处理消息.Spark中的Master.Worker都是RpcEndpoint . RpcEndpointRef :RpcEndpoint的引用,如果需要和RpcEndpoint通信,就必须获取它的RpcEndpointRef,通过RpcEn

Java concurrent AQS 源码详解

一.引言 AQS(同步阻塞队列)是concurrent包下锁机制实现的基础,相信大家在读完本篇博客后会对AQS框架有一个较为清晰的认识 这篇博客主要针对AbstractQueuedSynchronizer的源码进行分析,大致分为三个部分: 静态内部类Node的解析 重要常量以及字段的解析 重要方法的源码详解. 所有的分析仅基于个人的理解,若有不正之处,请谅解和批评指正,不胜感激!!! 二.Node解析 AQS在内部维护了一个同步阻塞队列,下面简称sync queue,该队列的元素即静态内部类No

深入Java基础(四)--哈希表(1)HashMap应用及源码详解

继续深入Java基础系列.今天是研究下哈希表,毕竟我们很多应用层的查找存储框架都是哈希作为它的根数据结构进行封装的嘛. 本系列: (1)深入Java基础(一)--基本数据类型及其包装类 (2)深入Java基础(二)--字符串家族 (3)深入Java基础(三)–集合(1)集合父类以及父接口源码及理解 (4)深入Java基础(三)–集合(2)ArrayList和其继承树源码解析以及其注意事项 文章结构:(1)哈希概述及HashMap应用:(2)HashMap源码分析:(3)再次总结关键点 一.哈希概

Shiro 登录认证源码详解

Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加的简单. 本文主要介绍 Shiro 的登录认证(Authentication)功能,主要从 Shiro 设计的角度去看这个登录认证的过程. 一.Shiro 总览 首先,我们思考整个认证过程的业务逻辑: 获取用户输入的用户名,密码: 从服务器数据源中获取相应的用户名和密码: 判断密码是否匹配,决定是否

Android编程之Fragment动画加载方法源码详解

上次谈到了Fragment动画加载的异常问题,今天再聊聊它的动画加载loadAnimation的实现源代码: Animation loadAnimation(Fragment fragment, int transit, boolean enter, int transitionStyle) { 接下来具体看一下里面的源码部分,我将一部分一部分的讲解,首先是: Animation animObj = fragment.onCreateAnimation(transit, enter, fragm

Spring IOC源码详解之容器依赖注入

Spring IOC源码详解之容器依赖注入 上一篇博客中介绍了IOC容器的初始化,通过源码分析大致了解了IOC容器初始化的一些知识,先简单回顾下上篇的内容 载入bean定义文件的过程,这个过程是通过BeanDefinitionReader来完成的,其中通过 loadBeanDefinition()来对定义文件进行解析和根据Spring定义的bean规则进行处理 - 事实上和Spring定义的bean规则相关的处理是在BeanDefinitionParserDelegate中完成的,完成这个处理需

Spring IOC源码详解之容器初始化

Spring IOC源码详解之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比较典型的代码 ClassPathResource res = new ClassPathResource("beans.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDe

IntentService源码详解

IntentService可以做什么: 如果你有一个任务,分成n个子任务,需要它们按照顺序完成.如果需要放到一个服务中完成,那么IntentService就会使最好的选择. IntentService是什么: IntentService是一个Service(看起来像废话,但是我第一眼看到这个名字,首先注意的是Intent啊.),所以如果自定义一个IntentService的话,一定要在AndroidManifest.xml里面声明. 从上面的"可以做什么"我们大概可以猜测一下Inten