PowerJob中的Vert.x的应用,是点睛之笔还是大材小用?我感觉有点故意炫技啊

news2025/7/31 4:32:59

这是一篇为了参加活动写得文章,不知道为什么,写得时候网络巨差,我是顶着闹心发上来的,最后大家女神节快乐。

最近难得忙了一下,领导让我从Vert.x和lagom中技术选型,因为lagom是scala写得,我虽然会一点,但是不多,于是选择了vert.x,我记得之前用vert.x,就用的一知半解的,于是这一次我想的是,一定要研究明白,一下子我就想到了,在研究powerjob源码的时候,server启动的时候有这么一行代码:

VertXStarter.init();

于是我就从这一行代码作为入手点,开始研究,powerjob是怎么运用vert.x的,进入init方法内部,发现是这个样子的:

public static Vertx vertx;
@Getter
private static String address;

public static void init() {
    Stopwatch stopwatch = Stopwatch.createStarted();
    Properties properties = PropertyUtils.getProperties();
    int port = Integer.parseInt(properties.getProperty(PowerJobServerConfigKey.HTTP_PORT, String.valueOf(OmsConstant.SERVER_DEFAULT_HTTP_PORT)));
    String portFromJVM = System.getProperty(PowerJobServerConfigKey.HTTP_PORT);
    if (StringUtils.isNotEmpty(portFromJVM)) {
        port = Integer.parseInt(portFromJVM);
    }
    String localIP = NetUtils.getLocalHost();
    address = localIP + ":" + port;
    vertx = Vertx.vertx();
}

其实这里面的代码,除了之前讲过的获取地址等内容,就只有一行代码是有用的,就是:

vertx = Vertx.vertx();

这个就是Vert.x的初始化,然后从这里代码就直接断开了,因为已经初始化结束了,接下来就是找哪里用到了这个vertx了,通过编辑器寻找到,是在tech.powerjob.server.core.handler.impl包下的Initializer类里面。

VertXStarter.vertx.deployVerticle(new WorkerRequestHttpHandler());

这一行代码的意思也很简单,就是部署一个Verticle,什么是Verticle?Verticle就是Vert.x最小的代码执行单元,类似于akka里面的Actor,所以就有疑问了,为什么不用actor呢?前面都用了,这里又要多用一个Verticle呢?这个我也不是很清楚,那就来看看这个Verticle吧,上面那一行代码指出,这个WorkerRequestHttpHandler,就是那个Verticle,源码如下所示:

public class WorkerRequestHttpHandler extends AbstractVerticle {

    @Override
    public void start() throws Exception {

        Properties properties = PropertyUtils.getProperties();
        int port = Integer.parseInt(properties.getProperty(PowerJobServerConfigKey.HTTP_PORT, String.valueOf(OmsConstant.SERVER_DEFAULT_HTTP_PORT)));

        HttpServerOptions options = new HttpServerOptions();
        HttpServer server = vertx.createHttpServer(options);

        Router router = Router.router(vertx);
        router.route().handler(BodyHandler.create());
        router.post(ProtocolConstant.SERVER_PATH_HEARTBEAT)
                .handler(ctx -> {
                    WorkerHeartbeat heartbeat = ctx.getBodyAsJson().mapTo(WorkerHeartbeat.class);
                    fetchWorkerRequestHandler().processWorkerHeartbeat(heartbeat);
                    success(ctx);
                });
        router.post(ProtocolConstant.SERVER_PATH_STATUS_REPORT)
                .blockingHandler(ctx -> {
                    TaskTrackerReportInstanceStatusReq req = ctx.getBodyAsJson().mapTo(TaskTrackerReportInstanceStatusReq.class);
                    try {
                        fetchWorkerRequestHandler().processTaskTrackerReportInstanceStatus(req);
                        out(ctx, AskResponse.succeed(null));
                    } catch (Exception e) {
                        out(ctx, AskResponse.failed(ExceptionUtils.getMessage(e)));
                    }
                });
        router.post(ProtocolConstant.SERVER_PATH_LOG_REPORT)
                .blockingHandler(ctx -> {
                    WorkerLogReportReq req = ctx.getBodyAsJson().mapTo(WorkerLogReportReq.class);
                    fetchWorkerRequestHandler().processWorkerLogReport(req);
                    success(ctx);
                });
        server.requestHandler(router).listen(port);
    }

    private static void out(RoutingContext ctx, Object msg) {
        ctx.response()
                .putHeader(OmsConstant.HTTP_HEADER_CONTENT_TYPE, OmsConstant.JSON_MEDIA_TYPE)
                .end(JsonObject.mapFrom(msg).encode());
    }

    private static void success(RoutingContext ctx) {
        out(ctx, ResultDTO.success(null));
    }
}

一句话总结一下上面代码,就是利用vert.x设置了一个HTTP的服务端,分别接受worker的心跳,任务实例的执行状态和日志,这个Router router = Router.router(vertx);里面的Router就类似于Spring里面的Controller,router.post就相当于设置了一个post方法,地址就是ProtocolConstant.SERVER_PATH_HEARTBEAT这个常量对应的字符串,所以疑问我就又来了,我记得在Actor里面也有接收心跳,状态和日志的功能,这又设置了一个,当然了,这个是用了和actor不同的方式,这个是用过http的方式得到的,估计可以连接openapi。

 所以总结来说,vert.x在powerjob里面的应用,就类似于spring,有些大材小用的感觉,反正我是没有时间验证我的猜想是否正确,就拿源码来说,我认为Vert.x其实可以不用出现,因为既然选择了spring和akka,这俩框架完全拥有Vert.x在该框架的作用,感觉就像是在故意炫技一般。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023高质量设计竞赛汇总,想证明自己实力的快来

对于设计师来说,参加设计比赛不仅能够提升自己的设计能力,也是一条证明实力最好的捷径。小编也收集整理了不少近期设计大赛,分别标注了截止日期和官网等,宝子们记得码住收藏,赶紧SHOW起来!优酷X站酷 一千零…

湖南媒体资源有哪些?湖南媒体邀约怎么做?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 湖南位于中国中南部,以其美丽的自然风光、丰富的历史文化和独特的湖湘文化而著名,拥有丰富的媒体资源。以下是一些湖南省的媒体资源: 1.湖南日报社: …

Spark 应用调优

Spark 应用调优人数统计优化摇号次数分布优化Shuffle 常规优化数据分区合并加 Cache优化中签率的变化趋势中签率局部洞察优化倍率分析优化表信息 : apply : 申请者 : 事实表lucky : 中签者表 : 维度表两张表的 Schema ( batchNum,carNum ) : ( 摇号批次&#xff0c…

Java基础——Lambda表达式

一、函数式编程思想概述https://www.runoob.com/java/java8-lambda-expressions.html在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿数据做操作”面向对象强调“必须通过对象的形式来做事情”,做事情之前首先要创建一个对象函数…

B站游戏推广,怎样查看B站游戏推广榜数据?

近年来,B站发展得越来越大,越来越多的游戏商也加入B站进行推广,那么作为游戏运营商,怎样查看游戏在B站上的推广数据呢?游戏排行榜游戏商业推广榜包含视频推广榜、直播推广榜,按照日榜、周榜、月榜&#xff…

【Linux 网络编程1】使用UDP/TCP编写套接字,多进程/多线程版本的TCP编写的套接字,将套接字封装

目录 1.学习网络编程前的一些基础知识 2.UDP(user datagram protocol)协议的特点 3.使用有UPD编写套接字 4.使用TCP编写套接字 4.2.TCP客服端 4.3.TCP服务器端 4.4.单进程版本(没有人会使用) 4.5.多进程版本 4.6.多线程版本 5.把套接字封装 1…

扬帆优配|2600亿新能源巨头狂飙!外资唱多中国:再涨15%

全国停摆的危机,正在迫临法国。 大停工正在将法国推向风险境地。法国政府估计,当地时间3月7日,将迸发全国大型停工游行。法国总工会宣告,到时将让全法国停摆。法国担任交通业务的部长级代表克莱蒙博讷正告称,7日将成为…

JavaScript 混淆技术

根据JShaman(JShaman是专业的JavaScript代码混淆加密网站)提供的消息,JavaScript混淆技术大体有以下几种: 变量混淆 将带有JS代码的变量名、方法名、常量名随机变为无意义的类乱码字符串,降低代码可读性,如…

原神 Android 教程 —安卓版

准备材料 一台能读写 /system 分区的 Android 手机(或:一台安装了 Magisk 的 Android 手机) 有人搞出来免root端了,此条件不再必须私服客户端

数据同步工具Sqoop

大数据Hadoop之——数据同步工具SqoopSqoop基本原理及常用方法 1 概述 Apache Sqoop(SQL-to-Hadoop)项目旨在协助RDBMS(Relational Database Management System:关系型数据库管理系统)与Hadoop之间进行高效的大数据交…

HStream Console、HStreamDB 0.14 发布

近两个月,HStreamDB 相继发布了 0.13 和 0.14 版本,包含多项已知问题修复。同时,我们也发布了全新的 HStream Console 组件,为 HStreamDB 带来了简洁友好的图形化管理界面,将帮助用户更轻松地使用和管理 HStreamDB. H…

LinqConnect兼容性并支持Visual Studio 2022版本

LinqConnect兼容性并支持Visual Studio 2022版本 现在支持Microsoft Visual Studio 2022版本17.5预览版。 添加了Microsoft.NET 7兼容性。 共享代码-共享相同的代码,以便在不同的平台上处理数据。LinqConnect是一种数据库连接解决方案,适用于不同的基于.…

Ubuntu下安装Docker

大家好,我是中国码农摘星人。 欢迎分享/收藏/赞/在看! 文章目录1 安装Docker1.1 使用官方安装脚本自动安装 (仅适用于公网环境)1.2 手动安装帮助1.2.1 Ubuntu 14.04 16.04 (使用apt-get进行安装)2 安装校验3 镜像加速器3.1 安装&a…

在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 数据库)

本文搭建的 SonarQube 版本是 7.4.9-community,由于在官方文档中声明 7.9 版本之后就不再支持使用 MySQL 数据库。所以此次搭建使用的数据库是 PostgreSQL 11.4 版本。 一、部署 PostgreSQL 服务 1. 创建命名空间 将 PostgreSQL 和 SonarQube 放在同一个命名空间…

Docker(二)

5.容器数据卷 1.什么是容器数据卷 docker理念回顾 将应用和环境打包成一个镜像! 数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化 MySQL,容器删了&#xff0c…

都工作3年了,怎么能不懂双亲委派呢?(带你手把手断点源码)

💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…

c盘怎么清理到最干净?有什么好的清理方法

c盘怎么清理到最干净?有什么好的清理方法?清理C盘空间是电脑维护的重要步骤之一。C盘是Windows操作系统的核心部分,保存了许多重要的系统文件,因此空间不足会影响计算机的性能和稳定性。下面是一些清理C盘空间的方法 一.清理临时文件 在使用…

【Java学习笔记】10.条件语句 - if...else及switch case 语句

前言 本章介绍Java的条件语句 - if…else和switch case 语句。 Java 条件语句 - if…else Java 中的条件语句允许程序根据条件的不同执行不同的代码块。 一个 if 语句包含一个布尔表达式和一条或多条语句。 语法 if 语句的语法如下: if(布尔表达式) {//如果布…

实验二:动态规划

1.双11的红包雨 问题描述 双11到了,据说这2天会下红包雨,每个红包有不同的价值,小k好开心,但有个规则,就只能接掉落在他身旁的10米范围内的红包(0-10这11个位置)。小k想尽可能的多抢红包&…

评价提高分子对接性能的组合策略

评价提高分子对接性能的组合策略 相关背景: 分子对接可能是应用于基于结构的药物设计和虚拟筛选活动中最快速、成本最低的计算技术,它可以从巨大的化合物文库中找到潜在的活性分子,用于先导发现。 在分子对接中,配体(通常是小分…