Vert.x (二): 我的第一個Vert.x 3 應用
- 歡迎關注http://quanke.name/
- 交流群:
231419585
- 轉載請註明出處,謝謝
如果,你聽到有人說Vert.x 是牛逼的。非常好!但是你自己想要嘗試的話,Ok great,那麼下一個問題自然是“從哪裡開始?”,這篇文章是一個很好的起點。文章展示了怎麼構建一個非常簡單的 vert.x 應用(這沒什麼大不了的),怎樣測試和執行vert.x應用。
文章裡提到的程式碼在github 。
開始
首先,建立一個專案,在這篇文章中使用Apache Maven
,當然你可以使用Gradle
或者其他工具,使用Maven jar archetype
-
src/main/java
目錄 -
src/test/java
目錄 -
pom.xml
檔案
會得到一個像這樣的結構
.
├── pom.xml
├── src
│ ├── main
│ │ └── java
│ └── test
│ └── java
pom.xml
檔案的內容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>name.quanke.study.vertx.first</groupId>
<artifactId>my-first-app</artifactId>
<version>1.0-SNAPSHOT</version >
<dependencies>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
這個 pom.xml 檔案非常簡單:
- 聲明瞭一個 vertx-core 依賴
- 配置了maven-compiler-plugin 外掛(使用的是
Java 8
).
第二點非常重要,
Vert.x
只支援Java 8
。
編碼!
OK,我們已經建立了一個pom.xml
檔案,接下來正式開始編碼,建立 src/main/java/name/quanke/study/vertx/first/MyFirstVerticle.java
檔案,內容如下:
package name.quanke.study.vertx.first;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
public class MyFirstVerticle extends AbstractVerticle {
public void start(Future<Void> fut) {
vertx
.createHttpServer()
.requestHandler(r -> {
r.response().end("<h1>Hello from my first " +
“Vert.x 3 application</h1>”);
})
.listen(8080, result -> {
if (result.succeeded()) {
fut.complete();
} else {
fut.fail(result.cause());
}
});
}
}
這個實際上不是最優秀的應用,這個類繼承AbstractVerticle
,在Vert.x
的世界裡verticle
就是元件,通過繼承AbstractVerticle
類,獲得vertx
的入口。
當verticle
部署後會呼叫start
方法,我們也能實現 stop
方法,在這個方法裡回收資源,start
方法接收Future
物件的引數,可以告訴使用者是執行完成還是報出錯誤,Vert.x
是非同步執行的,執行的時候不會等到start
方法執行完成,所以 Future
引數是非常重要的,可以通知是否已經執行完成。
在start
方法裡建立了一個HTTP 服務和一個請求處理器(handler),這個請求處理器使用lambda表示式,通過requestHandler
方法,每次伺服器收到請求,都會返回“Hello。。。”(也沒有什麼其他可以告訴你的東西了。。。),最後伺服器綁定了一個8080埠,這裡可能會失敗(因為8080埠可能被使用了),通過lambda表示式檢查是否連線成功,就想上面說的,呼叫fut.complete表示成功,呼叫 fut.fail 報告失敗。
使用下面的命令嘗試著編譯應用(首先你要安裝好了maven,此命令在pom.xml目錄下執行,知道使用maven的都懂得):
mvn clean compile
如果幸運,編譯應該是成功的。
應用就編寫到這裡,是不是很簡單?
測試
應用開發完成了,但是我們從來都不是很認真的,所有我們需要測試一下,測試使用JUnit
和 vertx-unit
。
開啟pom.xml
檔案,增加兩個依賴(dependencies):
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-unit</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
建立 src/main/java/name/quanke/study/vertx/first/MyFirstVerticleTest.java
檔案
package name.quanke.study.vertx.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;
public class MyFirstVerticleTest {
private Vertx vertx;
public void setUp(TestContext context) {
vertx = Vertx.vertx();
vertx.deployVerticle(MyFirstVerticle.class.getName(),
context.asyncAssertSuccess());
}
public void tearDown(TestContext context) {
vertx.close(context.asyncAssertSuccess());
}
public void testMyApplication(TestContext context) {
final Async async = context.async();
vertx.createHttpClient().getNow(<span class="hljs-number">8080</span>, <span class="hljs-string">"localhost"</span>, <span class="hljs-string">"/"</span>,
response -> {
response.handler(body -> {
context.assertTrue(body.toString().contains(<span class="hljs-string">"Hello"</span>));
async.complete();
});
});
}
}
在這裡使用JUnit
測試verticle
,也會使用到 vertx-unit
自定義的runner
,vert.x-unit
很容易測試非同步的vert.x
應用。
在setUp
方法裡,建立了一個Vertx
例項,deploy
了verticle
,你可能已經注意到了,這與傳統JUnit
的@Before
不一樣,它接收了一個TestContext
引數,TestContext
物件讓我們可以控制非同步的測試,例如:當我們deploy
了非同步verticle
,多個Vertx
例項相互作用時,不能檢測它的正確性,deployVerticle
方法的第二個引數返回一個handler:context.asyncAssertSuccess()
,如果verticle
的狀態是失敗,那這個測試就是失敗的,此外會等待verticle
完成啟動,還記得,在verticle
裡,我們呼叫了fut.complete()
方法,直到等到呼叫fut.complete()
方法才返回狀態。
tearDown
方法比較簡單,負責回收我們建立的vertx
物件。
現在我們看一下測試應用的testMyApplication
方法,給應用發出請求並且攔截一個返回,發出請求和接收答覆都是非同步的,我們需要一種方法來控制,setUp
和tearDown
方法接收一個TestContext
物件,當這個測試完成的時候,通過我們這個物件建立的非同步的處理器(async
),通知測試框架(使用async.complete()
)
像這樣,一個非同步處理器建立好了,我們使用getNow()
方法(getNow()
方法是get(...).end()
的捷徑),建立一個HTTP客戶端和發一個HTTP請求給我們的應用,響應使用lambda
處理,通過另一個lambda
的handler
方法接收一個response body
,這個body
引數是這個response body
(如buffer
物件),檢測body
是否等於“Hello”
字串,並且宣佈測試完成(async.complete()
)。
讓我們花一個分鐘的時間提一下這個斷言,不像傳統的使用context.assert...
斷言,如果斷言失敗,它會立即中斷測試,因為Vert.x
程式各方面都是非同步的,所以使用這種方式斷言測試很重要。
可以使用IDE或者Maven執行測試:
mvn clean test
打包
總結一下,我們有了應用程式和測試,接下來,給應用打包,在這篇文章中我們把應用打 成fat jar
包,一個 fat jar
包是一個可以獨立執行的jar
檔案,它包含所有的執行程式所需要的依賴,Vert.x
使用這種打包的方式非常方便,僅僅只有一個檔案,這使它非常容易執行。
建立一個 fat jar
便捷pom.xml
檔案,把下面的的程式碼增加到</plugins>
標籤之前:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>io.vertx.core.Starter</Main-Class>
<Main-Verticle>name.quanke.study.vertx.first.MyFirstVerticle</Main-Verticle>
</manifestEntries>
</transformer>
</transformers>
<artifactSet/>
<outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
</configuration>
</execution>
</executions>
</plugin>
使用maven-shade-plugin 建立fat jar
。在manifestEntries
標籤裡宣告我們的verticle
,你也許不知道從哪裡來的Starter
類,實際上,它是在vertx
例項化和部署verticle
的時候就有建立。
這個外掛的配置就是這樣,我們執行:
mvn clean package
應該會建立一個target/my-first-app-1.0-SNAPSHOT-fat.jar
,裡面嵌入了應用所有的依賴(包含vert.x
自己)。
執行
嗯,很高興擁有一個 fal jar
,但我們希望看到我們的應用程式的執行!正如上面所說,多虧了fat jar
包裝,執行vert.x應用程式是容易的:
java -jar target/my-first-app-1.0-SNAPSHOT-fat.jar
然後,開啟瀏覽器訪問 http://localhost:8080。
CTRL+C
停止應用執行。
總結
這個Vert.x 3速成班告訴你,怎麼使用Vert.x 3開發一個簡單的應用,怎麼測試、打包和執行,現在知道了在Vert.x 3 上任意建立令人驚奇的系統。接下來的時間看看怎麼配置我們的應用。
Happy coding & Stay tuned !
全科龍婷▼升職加薪
image </div>
</div>