第一个Vert.x 3应用程序

原文:http://mp.weixin.qq.com/s?__biz=MzA4MjUwNzQ0NQ==&mid=401398470&idx=1&sn=eee317418fe93a59dd979dc7945114b9#rd

从今天开始我们逐步翻译整理Vertx官网技术文档,并做最佳实践,Vertx技术初学者们可以参考这些文档,大牛们请忽略。

由于英语水平有限,翻译不足之处,烦请各位看官斧正。

代码

源代码 https://github.com/cescoffier/my-vertx-first-app

环境

  1. JDK 8

  2. Maven

开始

  1. 在你喜欢的地方,创建一个目录,vertxStart

  2. 创建 src/main/java 目录

  3. 创建 src/test/java 目录

  4. pom.xml 文件

整个项目结构如下:

    .
    |---pom.xml
    |---src
    |   |
    |   |---main
    |   |   |___ java
    |   |
    |   |___test
    |       |___ java

创建 pom.xml 文件


                  4.0.0
                  io.vertx.blog
                  my-first-app
                  1.0-SNAPSHOT

                  
                    
                        io.vertx
                        vertx-core
                        3.0.0
                    
                  

                  
                    
                        
                            maven-compiler-plugin
                            3.3
                            
                                1.8
                                1.8
                            
                        
                    
                   

这个 pom.xml 文件很清晰,包含了下面两点内容

  • 声明了 vertx-core 依赖

  • 配置maven-compiler-plugin 使用Java 8

第一个Vert.x 3应用程序_第1张图片

开始编写代码

创建 src/main/java/io/vertx/blog/first/MyFirstVerticle.java文件。

操作如下图

第一个Vert.x 3应用程序_第2张图片

内容如下:

package io.vertx.blog.first;

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

public class MyFirstVerticle extends AbstractVerticle {

    @Override
    public void start(Future fut) {
        vertx
            .createHttpServer()
            .requestHandler( r -> {
                r.response().end("

Hello from my first Vert.x 3 application

"); }) .listen(8080, result -> { if (result.succeeded()) { fut.complete(); } else { fut.fail(fut.cause()); } }); } }

这个程序很简单,这个类继承了AbstractVerticle。在Vert.x里,一个verticle就是一个组件。通过继承AbstractVerticle,我们的类就能够获取vertx对象并使用了。

当要部署verticle的时候,start方法就会被调用。当然,我们也可以实现一个stop方法,但是在这个例子中,并没有实现这个方法,将由Vert.x来替我们进行垃圾回收。这个start方法接受一个Future对象,当我们start方法完成了或者报告一个错误的时候,它会通知Vert.x。Vert.x一个特性就是异步/无阻塞,当我们部署verticle的时候,它并不会等到这个start方法完成才完成部署。因此,这个Future参数对于通知Vert.x,start方法完成是非常重要的。(小编注:这边有点绕,因为start方法内含有异步回调,这些代码不会马上执行,而Vertx不会等待这些代码的执行,它会一直往下走直到结束)

这个start方法创建了一个HTTP服务器、接受一个请求并处理它。这个处理request请求的是一个lambda表达式,传入一个requestHandler方法,任何时刻,当这个服务器接受一个请求就会调用。这里,我们会返回一个“hello...”的字符串。最后,这个服务器绑定了8080端口。这可能会失败,因为8080端口可能被占用了。我们传入了另外一个lambda表达式,来检查这个链接是否成功了。就像前面提到的,当成功的时候,它会调用fut.complete,失败了就调用ful.fail返回一个错误。

编译

mvn clean compile

编译结果如下图所示:

第一个Vert.x 3应用程序_第3张图片

测试

完成了应用的开发工作是很好的,但是我们可能并没有那么细心,所以需要对它进行测试。这个测试,使用了junitvertx-unitvertx-unit是vert.x的一个组件,用来测试vert.x的应用程序将会更加的得心应手。

打开pom.xml文件,然后加上下面两个依赖。


    junit
    junit
    4.12
    test


    io.vertx
    vertx-unit
    3.0.0
    test

接下来,创建测试类,src/test/java/io/vertx/blog/first/MyFirstVerticleTest.java,内容如下:

package io.vertx.blog.first;

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 MyFirstVerticleTest {

    private Vertx vertx;

    @Before
    public void setUp(TestContext context) {
        vertx = Vertx.vertx();
        vertx.deployVerticle(MyFirstVerticle.class.getName(),
        context.asyncAssertSuccess());
    }

    @After
    public void tearDown(TestContext context) {
        vertx.close(context.asyncAssertSuccess());
    }

    @Test
    public void testMyApplication(TestContext context) {
        final Async async = context.async();

        vertx.createHttpClient().getNow(8080, "localhost", "/",
        response -> {
            response.handler(body -> {
            context.assertTrue(body.toString().contains("Hello"));
            async.complete();
            });
        });
    }
}

这是用来测试我们verticle的Junit测试,它使用了vertx-unit,vert.x-unit会让我们的异步测试变的更加容易,同时也是vert.x的基本组件之一。

setUp方法里,我们创建了一个Vertx的实例并且部署了verticle。你可能会注意到,@Before方法与我们传统的测试方法不一样,它接收一个TestContext参数。这个对象让我们控制测试程序的异步部分。举例来说,当我们部署verticle的时候,它启动是异步的。在它正确启动之前我们并不能检查什么。因此,deployVerticle方法的第二个参数,我们传入一个结果的处理者:context.asyncAssertSuccess()。如果verticle没有正确启动,这个测试就失败了。此外,它会等待直到vertical完成。记住,在我们的verticle中,我们调用fut.complete()。因此,它会等待直到这个方法被调用,而在调用失败的情况下,测试也会失败。

这个tearDown方法就简单了,仅仅是结束我们创建的这个vertx实例。

现在让我们来看看测试程序的这个testMyApplication方法。这个方法向我们的应用程序发出一个请求并且检查结果。发出请求和接收回复是异步。所以,我们需要一个能够控制异步的方式。就像,setUptearDown方法,这个测方法接收一个TestContext参数。在这个对象中,我们创建了一个异步处理对象async,当测试完成的时候,使用async.complete()帮我们通知测试框架。

所以,一旦async handle被创建了,我们就创建了一个HTTP的客户端并且提交了一个HTTP请求,由我们的应用程序通过调用getNow()getNowget(...).end()的缩写)方法来处理。这个Response是通过lambda表达式来处理的。在lambda表达式中,我们通过传入另一个lambda表达式到handler方法来取得响应。body参数就是响应(作为一个buffer对象)。我们检查这个响应体包含了字符串"Hello"然后声明测试已经完成了。

现在让我们再来看一下这个assertions。不像传统的junit测试,它使用context.assert...。实际上,当assertion失败,将会立刻打断这个测试。所以,使用这些assertion方法对测试Vert.x异步应用程序是非常重要的。

我们的测试可以在IED中运行,也可以使用maven:

mvn clean test

编写test类后,开始测试。如图:

第一个Vert.x 3应用程序_第4张图片

打包

现在让我们来总结一下。我们有一个应用程序和一个测试程序。现在我们需要来打包这个应用程序。在这篇文章中,我们将应用程序打包到一个fat.jar里。fat.jar是一个单独的可执行的Jar文件,包含了所有运行这个程序的依赖。把Vert.x应用程序打包成一个文件是很方便的,同时也容易执行。

为了创建这个fat.jar,我们需要编辑pom.xml文件,添加下面这个片段到之前。


    org.apache.maven.plugins
    maven-shade-plugin
    2.3
    
        
        package
        
            shade
        
        
            
                
                
                    io.vertx.core.Starter
                    io.vertx.blog.first.MyFirstVerticle
                
                
            
            
            ${project.build.directory}/${project.artifactId}-${project.version}-fat.jar
            
        
    

这里使用maven-shade-plugin插件来创建fat jar。在manifestEntries里写明了verticle的名字。你可能会奇怪Starter类是怎么来的。它实际上是vert.x的一个类,由它创建vertx实例和部署我们的verticle

配置好插件,然我们开始运行:

mvn clean package

之后,将会创建target/my-first-app-1.0-SNAPSHOT-fat.jar将所有的依赖都嵌入到了我们的程序之中(包括vert.x本身)。

执行我们的应用程序

现在,我们有了fat jar,但是我们想要看的我们的程序运行起来。前面说了,由于打包fat jar,运行一个vert.x将会很容易:

java -jar target/my-first-app-1.0-SNAPSHOT-fat.jar

执行成功后如下图所示:

第一个Vert.x 3应用程序_第5张图片

然后,打开浏览器访问http://localhost:8080。

参考结果如下图所示:

第一个Vert.x 3应用程序_第6张图片
Ctrl + c停止。


总结

这个Vert.x 3速成教程,向你展现了怎么使用Vert.x 3部署一个简单的应用程序,还有如何测试、打包和运行。现在你已经知道了使用Vert.x 3构建一个非常棒的程序需要的所有基本步骤。


原文作者:Escoffier

翻译+实践:weiyiysw

校对:子期

转载请注明出处


欢迎关注我们的公众号:

第一个Vert.x 3应用程序_第7张图片


你可能感兴趣的:(Vert.x)