源代码 https://github.com/cescoffier/my-vertx-first-app
JDK 8
Maven
在你喜欢的地方,创建一个目录,vertxStart
创建 src/main/java
目录
创建 src/test/java
目录
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
这个 pom.xml
文件很清晰,包含了下面两点内容
声明了 vertx-core
依赖
配置maven-compiler-plugin
使用Java 8
创建 src/main/java/io/vertx/blog/first/MyFirstVerticle.java
文件。
操作如下图
内容如下:
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
编译结果如下图所示:
完成了应用的开发工作是很好的,但是我们可能并没有那么细心,所以需要对它进行测试。这个测试,使用了junit
和vertx-unit
。vertx-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
方法。这个方法向我们的应用程序发出一个请求并且检查结果。发出请求和接收回复是异步。所以,我们需要一个能够控制异步的方式。就像,setUp
和tearDown
方法,这个测方法接收一个TestContext
参数。在这个对象中,我们创建了一个异步处理对象async
,当测试完成的时候,使用async.complete()
帮我们通知测试框架。
所以,一旦async handle
被创建了,我们就创建了一个HTTP的客户端并且提交了一个HTTP请求,由我们的应用程序通过调用getNow()
(getNow
是get(...).end()
的缩写)方法来处理。这个Response是通过lambda表达式来处理的。在lambda表达式中,我们通过传入另一个lambda表达式到handler
方法来取得响应。body
参数就是响应(作为一个buffer对象)。我们检查这个响应体包含了字符串"Hello"
然后声明测试已经完成了。
现在让我们再来看一下这个assertions。不像传统的junit测试,它使用context.assert...
。实际上,当assertion失败,将会立刻打断这个测试。所以,使用这些assertion方法对测试Vert.x异步应用程序是非常重要的。
我们的测试可以在IED中运行,也可以使用maven:
mvn clean test
编写test类后,开始测试。如图:
现在让我们来总结一下。我们有一个应用程序和一个测试程序。现在我们需要来打包这个应用程序。在这篇文章中,我们将应用程序打包到一个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
执行成功后如下图所示:
然后,打开浏览器访问http://localhost:8080。
参考结果如下图所示:
这个Vert.x 3速成教程,向你展现了怎么使用Vert.x 3部署一个简单的应用程序,还有如何测试、打包和运行。现在你已经知道了使用Vert.x 3构建一个非常棒的程序需要的所有基本步骤。
原文作者:Escoffier
翻译+实践:weiyiysw
校对:子期
转载请注明出处
欢迎关注我们的公众号: