用慣了高大上SpringBoot不妨試試小清新Vert.x

Vert.x是一個基於netty的異步的工具集。能夠簡單理解成運行在JVM上的Node.js。本文是簡單的入門教程。java

Hello Vert.x

新建項目

在IDEA中新建一個Gradle項目(名爲hello):
圖片描述
圖片描述
圖片描述git

從官網github例子中複製build.gradle文件內容,並修改maven倉庫url改爲國內淘寶鏡像的,因爲我沒有使用gradle wrapper,因此官網build.gradle例子中最後關於wrapper的task我也刪除了,最後代碼以下:github

plugins {
    id 'java'
    id 'application'
    id 'com.github.johnrengelman.shadow' version '1.2.3'
}

repositories {
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
}

sourceCompatibility = '1.8'

dependencies {
    compile "io.vertx:vertx-core:3.5.0"
}

mainClassName = 'io.vertx.example.HelloWorldEmbedded'

shadowJar {
    classifier = 'fat'
    mergeServiceFiles {
        include 'META-INF/services/io.vertx.core.spi.VerticleFactory'
    }
}

別忘了修改了build.gradle文件內容以後,須要點擊IDEA右邊gradle欄目的刷新按鈕,以更新項目依賴信息:
圖片描述瀏覽器

編寫程序

新增一個類:com.abc.Application,繼承vertx的AbstractVerticle抽象類,重寫start方法,在方法中編寫啓動一個服務端的代碼:app

package com.abc;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;

public class Application extends AbstractVerticle {

    @Override
    public void start(Future<Void> f) throws Exception {
        vertx.createHttpServer()
                .requestHandler(req->{
                    req.response().end("Hello Vert.x");
                })
                .listen(8080,result->{
                    if (result.succeeded()){
                        f.complete();
                    }else{
                        f.fail(result.cause());
                    }
                });
    }

}

在vert.x中,一個verticle就是一個組件。Application繼承AbstractVerticle,即Application是一個組件。從代碼中能夠看到,Application用到了父類提供的vertx成員。vertx成員提供建立服務端的方法。異步

start方法會在verticle部署的時候執行。start方法實際上是一個回調方法,它能夠有一個Future類型的參數(io.vertx包的),該參數能夠用來通知Vertx當前這個verticle的start方法是否執行成功。因爲Vert.x是異步非阻塞的,因此verticle部署的時候,不會等待start方法執行結束,所以才須要一個Future類型的參數來通知Vert.x執行是否成功。async

在start方法中,咱們建立了一個http服務端,並註冊了請求處理器(requestHandler),顧名思義,請求處理器中的方法會在每次請求到來時執行。最後,讓該http服務端監聽8080端口。maven

測試代碼

添加單元測試所需依賴:ide

dependencies {
    compile "io.vertx:vertx-core:$version"
    compile "io.vertx:vertx-unit:$version"
    compile "junit:junit:4.12"
}

編寫測試com.abc.ApplicationTest工具

package com.abc;

import io.vertx.core.Vertx;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(VertxUnitRunner.class)
public class ApplicationTest {

    //vertx容器
    private Vertx vertx;

    @Before
    public void setUp(TestContext context) {
        //建立一個vertx容器的實例
        vertx = Vertx.vertx();
        //將Application這個verticle部署到容器中,並註冊部署完成的處理器
        vertx.deployVerticle(Application.class.getName(),
                context.asyncAssertSuccess());
    }

    @After
    public void tearDown(TestContext context) {
        //關閉容器,註冊關閉完成的處理器
        vertx.close(context.asyncAssertSuccess());
    }

    @Test
    public void testApplication(TestContext context) {
        final Async async = context.async();
        //建立一個http客戶端,發送請求到http服務端
        vertx.createHttpClient().getNow(8080, "localhost", "/",
                response -> {
                    response.handler(body -> {
                        context.assertTrue(body.toString().contains("Hello"));
                        async.complete();
                    });
                });
    }

}

上面的測試代碼用到了vertx-unit模塊,該模塊是用來測試異步的代碼的。在setUp方法中,咱們建立了一個vertx容器,並部署Application這個verticle到容器中(部署時會執行Application類的start方法)。setUp方法有一個TestContext參數,是用來控制異步代碼的。當部署verticle時,verticle的start方法異步執行。所以將context.asyncAssertSuccess()(一個Handler<AsyncResult>)傳入到deployVerticle方法中,那麼deployVerticle方法執行成功或失敗,都會有與這個Handler來執行對應的操做。

在testApplication方法中,因爲發送請求和接收請求的過程是異步的,因此咱們建立了一個Async處理器,並在收到響應的回調中執行async.complete()來通知測試的上下文該單元測試完成了。

項目打包

修改build.gradle文件:

plugins {
    id 'java'
    id 'application'
    id 'com.github.johnrengelman.shadow' version '1.2.3'
}

repositories {
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
}

sourceCompatibility = '1.8'
mainClassName = 'io.vertx.core.Launcher' //<--add
def mainVerticleName = 'com.abc.Application'//<--add

dependencies {
    compile "io.vertx:vertx-core:3.5.0"
    compile "io.vertx:vertx-unit:3.5.0"
    compile "junit:junit:4.12"
}

shadowJar {
    classifier = 'fat'
    manifest {  //<--add
        attributes "Main-Verticle": mainVerticleName
    }
    mergeServiceFiles {
        include 'META-INF/services/io.vertx.core.spi.VerticleFactory'
    }
}

執行gradle shadowJar命令打包。運行打包出來的Jar包,而後瀏覽器輸入127.0.0.1:8080訪問便可看到響應的內容。
圖片描述

相關文章
相關標籤/搜索