前景回顾

【mq】从零开始实现 mq-01-生产者、消费者启动

【mq】从零开始实现 mq-02-如何实现生产者调用消费者?

【mq】从零开始实现 mq-03-引入 broker 中间人

【mq】从零开始实现 mq-04-启动检测与实现优化

上一节我们引入了中间人 broker,让消息的生产者和消费者解耦。

这一节我们对初始化代码进行优化,便于后期拓展维护。

生产者启动优化

启动实现

整体实现调整如下:

  1. @Override
  2. public synchronized void run() {
  3. this.paramCheck();
  4. // 启动服务端
  5. log.info("MQ 生产者开始启动客户端 GROUP: {}, PORT: {}, brokerAddress: {}",
  6. groupName, port, brokerAddress);
  7. try {
  8. //channel future
  9. this.channelFutureList = ChannelFutureUtils.initChannelFutureList(brokerAddress,
  10. initChannelHandler(), check);
  11. // register to broker
  12. this.registerToBroker();
  13. // 标识为可用
  14. enableFlag = true;
  15. log.info("MQ 生产者启动完成");
  16. } catch (Exception e) {
  17. log.error("MQ 生产者启动遇到异常", e);
  18. throw new MqException(ProducerRespCode.RPC_INIT_FAILED);
  19. }
  20. }

看起来是不是比起原来清爽很多呢?

但是复杂性只会转移,不会消失

答案就是封装到 initChannelFutureList 中去了。

initChannelFutureList

因为这里是生产者、消费者都会用到。

所以我们先放在统一的工具类中,实现本身和以前大同小异。

  1. /**
  2. * 初始化列表
  3. * @param brokerAddress 地址
  4. * @param channelHandler 处理类
  5. * @param check 是否检测可用性
  6. * @return 结果
  7. * @since 0.0.4
  8. */
  9. public static List<RpcChannelFuture> initChannelFutureList(final String brokerAddress,
  10. final ChannelHandler channelHandler,
  11. final boolean check) {
  12. List<RpcAddress> addressList = InnerAddressUtils.initAddressList(brokerAddress);
  13. List<RpcChannelFuture> list = new ArrayList<>();
  14. for(RpcAddress rpcAddress : addressList) {
  15. try {
  16. final String address = rpcAddress.getAddress();
  17. final int port = rpcAddress.getPort();
  18. EventLoopGroup workerGroup = new NioEventLoopGroup();
  19. Bootstrap bootstrap = new Bootstrap();
  20. ChannelFuture channelFuture = bootstrap.group(workerGroup)
  21. .channel(NioSocketChannel.class)
  22. .option(ChannelOption.SO_KEEPALIVE, true)
  23. .handler(new ChannelInitializer<Channel>(){
  24. @Override
  25. protected void initChannel(Channel ch) throws Exception {
  26. ch.pipeline()
  27. .addLast(new LoggingHandler(LogLevel.INFO))
  28. .addLast(channelHandler);
  29. }
  30. })
  31. .connect(address, port)
  32. .syncUninterruptibly();
  33. log.info("启动客户端完成,监听 address: {}, port:{}", address, port);
  34. RpcChannelFuture rpcChannelFuture = new RpcChannelFuture();
  35. rpcChannelFuture.setChannelFuture(channelFuture);
  36. rpcChannelFuture.setAddress(address);
  37. rpcChannelFuture.setPort(port);
  38. rpcChannelFuture.setWeight(rpcAddress.getWeight());
  39. list.add(rpcChannelFuture);
  40. } catch (Exception exception) {
  41. log.error("注册到 broker 服务端异常", exception);
  42. if(check) {
  43. throw new MqException(MqCommonRespCode.REGISTER_TO_BROKER_FAILED);
  44. }
  45. }
  46. }
  47. if(check
  48. && CollectionUtil.isEmpty(list)) {
  49. log.error("check=true 且可用列表为空,启动失败。");
  50. throw new MqException(MqCommonRespCode.REGISTER_TO_BROKER_FAILED);
  51. }
  52. return list;
  53. }

这里的 check 为了避免 2 种情况:

(1)某一个 broker 不可用

(2)没有可用的 broker 信息。

消费者启动优化

消费者连接 broker 和生产者是类似的。

这里只是放一下实现,不做更多的赘述。

  1. @Override
  2. public void run() {
  3. // 启动服务端
  4. log.info("MQ 消费者开始启动服务端 groupName: {}, brokerAddress: {}",
  5. groupName, brokerAddress);
  6. //1. 参数校验
  7. this.paramCheck();
  8. try {
  9. //channel future
  10. this.channelFutureList = ChannelFutureUtils.initChannelFutureList(brokerAddress,
  11. initChannelHandler(),
  12. check);
  13. // register to broker
  14. this.registerToBroker();
  15. // 标识为可用
  16. enableFlag = true;
  17. log.info("MQ 消费者启动完成");
  18. } catch (Exception e) {
  19. log.error("MQ 消费者启动异常", e);
  20. throw new MqException(ConsumerRespCode.RPC_INIT_FAILED);
  21. }
  22. }

小结

这一小节的内容特别简单,对初始化部分做了优化,便于后期维护拓展。

希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。

我是老马,期待与你的下次重逢。

开源地址

The message queue in java.(java 简易版本 mq 实现) https://github.com/houbb/mq

拓展阅读

rpc-从零开始实现 rpc https://github.com/houbb/rpc

【mq】从零开始实现 mq-04-启动检测与实现优化的更多相关文章

  1. ubuntu11.04启动 及虚拟文件系统

    虚拟文件系统(VFS)是由Sun microsystems公司在定义网络文件系统(NFS)时创造的.它是一种用于网络环境的分布式文件系统,是允许和操作系统使用不同的文件系统实现的接口.虚拟文件系统(V ...

  2. Android 性能优化之内存泄漏检测以及内存优化(中)

    https://blog.csdn.net/self_study/article/details/66969064 上篇博客我们写到了 Java/Android 内存的分配以及相关 GC 的详细分析, ...

  3. 理解Tomcat架构、启动流程及其性能优化

    PS:but, it's bullshit ! 备注:实话说,从文档上扒拉的,文档地址:在每一个Tomcat安装目录下,会有一个webapps文件夹,里面有一个docs文件夹,点击index.html ...

  4. website 性能检测 & 前端性能优化

    website 性能检测 & 前端性能优化 https://cdn.xgqfrms.xyz/ https://mobile.xgqfrms.xyz/ PageSpeed Insights ht ...

  5. 四大MQ比较及MQ详解

    消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之 一.当今市面上有很多主流的消息中间件,如老牌的Activ ...

  6. Ubuntu 16.04 启动错误 "a start job is running for hold until boot process finishes up"

    老司机也差点翻船... 升级16.04的时候,将默认启动管理器(default display manager)选为gm3(gnome3)了(应该使用默认的lightgm)如果改成gm3,好像是nvi ...

  7. 【消息队列MQ】各类MQ比较

    目录(?)[-] RabbitMQ Redis ZeroMQ ActiveMQ JafkaKafka 目前业界有很多MQ产品,我们作如下对比: RabbitMQ 是使用Erlang编写的一个开源的消息 ...

  8. U盘制作Ubuntu15.04启动盘失败

    先用ubuntu15.04光盘在已有xp的电脑上安装成功​ 随后在Ubuntu安装labview说glibc没安装​ 但是ldd --version显示是安装的新版的​ 后来怀疑是86_64的原因​ ...

  9. Ubuntu 18.04 启动root账号并授权远程登录

    Ubuntu 18.04 刚刚上市2个月,下载安装,尝尝鲜~ 安装界面看上去舒服许多, 安装的速度也较之前17.04 和16.04 都快了许多.抱歉,未截图. Ubuntu 安装完成后默认不启动roo ...

随机推荐

  1. 什么是openssl?

    在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份.这个包广泛被应用在互联网的网页服务器上.

  2. JavaScript的一些实用操作(逐步添加)

    1.js代码简洁高效计时 console.time('a'); //记录时间开始 ... console.timeEnd('a'); //记录时间结束 a: 12857.81103515625ms / ...

  3. Mac SVN Cornerstone 安装使用详解

    Cornerstone 是收费软键,这里提供一个破解版 ,安装后需要输入安装密码:www.ifunmac.com 链接:https://pan.baidu.com/s/1LqY2s8vEJAQ9JJh ...

  4. 学习Keepalived(三)

    1.1Keepalived高可用软件 Keepalived起初是专为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入了VRRP的功能,因此除了配合LVS服务外,也可以作为其他服 ...

  5. ACM - 最短路 - AcWing 849 Dijkstra求最短路 I

    AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...

  6. 谷歌地图 API 开发之信息窗口

    信息窗口 简介 InfoWindow 在地图上方给定位置的弹出窗口中显示内容(通常为文本或图像).信息窗口具有一个内容区域和一个锥形柄.柄顶部与地图上的某指定位置相连. 通常,您会将信息窗口附加到标记 ...

  7. Issues with position fixed & scroll(移动端 fixed 和 scroll 问题)

    转载请注明英文原文及译文出处 原文地址:Issues with position fixed & scrolling on iOS 原文作者:Remy Sharp译文地址:移动端 fixed ...

  8. Linux安装JDK报错

    报错内容: tar (child): jdk-8u141-linux-x64.tar.gz: Cannot open: No such file or directory tar (child): E ...

  9. mysql基本操作2

    ##DDL控制表结构,不支持事务##DML控制表数据,支持事务       DQL专门做查询  ##TCL 管理事务##DCL 管理数据库权限     ##ORDER BY  子句-根据指定列对结果集 ...

  10. Python简单文件读写

    ''' 用文件存储账户信息 使用列表存储多个账户信息,每个账户为一个字典对象 ''' users=[] #创建一个空列表 users.append({'id':'admin','pwd':'1235@ ...