• vertx的学习总结2


    一、什么是verticle

    verticle是vertx的基本单元,其作用就是封装用于处理事件的技术功能单元  (如果不能理解,到后面的实战就可以理解了)

    二、写一个verticle

    1. 引入依赖(这里用的是gradle,不会吧,不会吧,都学这个了还有人不会gradle 0.0)

    1. plugins {
    2. java
    3. }
    4. repositories {
    5. mavenCentral()
    6. }
    7. dependencies {
    8. implementation("io.vertx:vertx-core:VERSION")
    9. implementation("ch.qos.logback:logback-classic:1.2.3")
    10. }
    11. tasks.create("run") {
    12. main = project.properties.getOrDefault("mainClass","chapter2.hello.HelloVerticle") as String
    13. classpath = sourceSets["main"].runtimeClasspath
    14. systemProperties["vertx.logger-delegate-factory-class-name"] ="io.vertx.core.logging.SLF4JLogDelegateFactory"
    15. }
    16. java {
    17. sourceCompatibility = JavaVersion.VERSION_1_8
    18. }

    logback.xml 文件

    1. <configuration>
    2. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    3. <encoder>
    4. <pattern>%level [%thread] %logger{0} - %msg%npattern>
    5. encoder>
    6. appender>
    7. <logger name="io.netty" level="warn"/>
    8. <root level="debug">
    9. <appender-ref ref="STDOUT"/>
    10. root>
    11. configuration>

    代码

    1. package org.example;
    2. import io.vertx.core.AbstractVerticle;
    3. import io.vertx.core.Vertx;
    4. import io.vertx.core.http.HttpServerOptions;
    5. public class Tearch extends AbstractVerticle {
    6. @Override
    7. public void start() throws Exception {
    8. vertx.createHttpServer(new HttpServerOptions().setPort(8080)).requestHandler(req->{
    9. req.response().end("hello word");
    10. }).listen();
    11. }
    12. public static void main(String[] args) {
    13. Tearch tearch=new Tearch();
    14. Vertx vertx1=Vertx.vertx();
    15. vertx1.deployVerticle(tearch);
    16. }
    17. }

    好,现在让我们想一下

    事件循环被阻塞时会发生什么?

    答案:会报错,它那个有个超时检测,不信你可以让它执行一个whlie(true),这里忘记说了setTimer是延迟任务

    设置检测时间

    在存在异步初始化工作的情况下,如何延迟生命周期完成的通知?   答:使用Async.await()方法等待异步操作完成。或者用public void start(Promise promise)   这个有应答的方法,具体操作如下

    在这里我先声明如下,这里的所有截图都是采自vert.x in Action的那本入门英语书

    三、一个verticle的部署和卸载

    在一个定时任务中可以通过deplay()方法进行部署

    自然也是可以通过定时任务进行卸载

    四、接下来我们讲vertx的线程模型

    默认情况下,为Vert.x创建的事件循环线程数是CPU内核数的两倍。如果你有8个核心,那么一个Vert.X应用程序有16个事件循环。

    这给了我们一个有趣的教训:虽然一个verticle总是使用相同的事件循环线程,但事件循环线程是由多个verticle共享的。这种设计使运行应用程序的线程数量可预测。
    提示:可以调整可用的事件循环数量,但不可能手动为特定事件循环分配给定的垂直方向。这在实践中不应该是一个问题,但在最坏的情况下,您总是可以计划顶点的部署顺序。

    在 Vert.x 中,所有的事件处理器都运行在一个事件循环线程池中,称为 Event Loop。Event Loop 是一个单线程,负责接收、分发和处理事件。

    当一个事件到达时,Vert.x 会将事件分派给空闲的 Event Loop 线程进行处理。Event Loop 会按照注册的事件处理器顺序依次执行,并且在执行过程中不会被阻塞。如果某个事件处理器需要执行一个耗时的操作,可以将其委托给 Worker 线程池进行处理,以免阻塞 Event Loop。

    Worker 线程池是一个可配置的线程池,用于执行耗时的操作。通过将耗时的操作委托给 Worker 线程池,可以避免阻塞 Event Loop,提高系统的并发性能。

    总结起来,Vert.x 的线程模型使用了事件循环和异步编程模型,通过 Event Loop 和 Worker 线程池来处理事件并发和耗时操作,以提高系统的吞吐量和响应性能。

    五、传递配置参数如下:

    从代码上看就是 deployVerticle里面多加了一个配置参数。

  • 相关阅读:
    Spring系列-bean标签内autowire属性应用
    Shell脚本之正则表达式
    文本处理三剑客之 sed 流编辑器(高级部分)
    二进制搭建以太坊节点
    风伤卫,寒伤营,真不是你想的那么容易
    h264编码算法流程
    torchvision.datasets.ImageFolder
    机器学习之机器如何学习
    Python构建Web爬虫
    建筑能源管理(2)——建筑用能分类与计算方法
  • 原文地址:https://blog.csdn.net/m0_63251896/article/details/133500515