添加依賴
Maven:
<dependency> <groupId>io.vertx</groupId> <artifactId>vertx-core</artifactId> <version>3.9.5</version> <dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>3.9.5</version>
<dependency>
Gradle:
dependencies { compile 'io.vertx:vertx-core:3.9.5' }
dependencies {
compile 'io.vertx:vertx-core:3.9.5'
}
重點
- 一個Vert.x對象擁有一個Event Bus、多個Event Loop(默認為2*CPU core count)
- 不要阻塞Event Bus
- 一個Vert.x對象維護多個Event Loop線程
執行阻塞代碼
vertx.executeBlocking<String>( { val result = api.action() it.complete(result) }, { println("result: [${it.result()}]") } )
當在同一個Context中調用多次executeBlocking時會順序執行,若不想讓他順序執行,讓ordered
參數設為false
並發合併
CompositeFuture.all
接受多個Future對象作為參數(至多六個,或傳入List),當所有Future成功返回一個成功的Future,反之則返回一個失敗的FutureCompositeFuture.any
與上述相似,差別在於有一個Future成功則成功,反之,全部失敗則失敗CompositeFuture.compose
順序合併Future
Verticle
坑: Vertx實例會在初始化後才進行注入,所以想在Verticle中使用Vertx實例必須在start()中編寫,否則會報空指標錯誤。
編寫Verticle需繼承AbstractVerticle,其結構如下
public class MyVerticle extends AbstractVerticle{ // Called when verticle is deployed // Verticle 部署時調用 public void start(){ } // Optional - called when verticle is undeployed // Verticle 撤銷部署時調用 public void stop(){ } }
Verticle種類
- Stardand Verticle: 工作在Event Loop線程上
- Worker Verticle: 工作在Worker Pool線程上,線程安全(一個實例不會被多個執行緒執行)
- Multi-Threaded Worker Verticle: 工作在Worker Pool線程上,一個實例可以被多個執行緒執行,但須開發者確保線程安全
Event Bus
接收者:
MessageConsumer<String> consumer = eventBus.consumer("news.uk.sport"); consumer.handler(message -> { System.out.println("I have received a message: " + message.body()); message.reply("how interesting!"); });
發送者:
eventBus.send("news.uk.sport", "Yay! Someone kicked a ball across a patch of grass", ar -> { if (ar.succeeded()) { System.out.println("Received reply: " + ar.result().body()); } });
本地共享Map
本地共享Map LocalMap
允許您在同一個Vert.x實例中的不同Event Loop(如不同的Verticle中)之間安全共享數據。
示例
SharedData sd = vertx.sharedData(); LocalMap<String, String> map1 = sd.getLocalMap("mymap1"); map1.put("foo", "bar"); // Strings are immutable so no need to copy LocalMap<String, Buffer> map2 = sd.getLocalMap("mymap2"); map2.put("eek", Buffer.buffer().appendInt(123)); // This buffer will be copied before adding to map // Then... in another part of your application: map1 = sd.getLocalMap("mymap1"); String val = map1.get("foo"); map2 = sd.getLocalMap("mymap2"); Buffer buff = map2.get("eek");
集群範圍異步Map
集群範圍異步Map(Cluster-wide asynchronous maps)允許從集群的任何節點將數據放到Map 中,並從任何其他節點讀取。
SharedData sd = vertx.sharedData(); sd.<String, String>getClusterWideMap("mymap", res -> { if (res.succeeded()) { AsyncMap<String, String> map = res.result(); } else { // Something went wrong! } });
將數據放入Map
map.put("foo", "bar", resPut -> { if (resPut.succeeded()) { // Successfully put the value } else { // Something went wrong! } });
讀取Map
map.get("foo", resGet -> { if (resGet.succeeded()) { // Successfully got the value Object val = resGet.result(); } else { // Something went wrong! } });
文件系統
Vertx vertx = Vertx.vertx(); // Read a file // 讀取文件 vertx.fileSystem().readFile("target/classes/readme.txt", result -> { if (result.succeeded()) { System.out.println(result.result()); } else { System.err.println("Oh oh ..." + result.cause()); } }); // Copy a file // 複製文件 vertx.fileSystem().copy("target/classes/readme.txt", "target/classes/readme2.txt", result -> { if (result.succeeded()) { System.out.println("File copied"); } else { System.err.println("Oh oh ..." + result.cause()); } }); // Write a file // 寫入文件 vertx.fileSystem().writeFile("target/classes/hello.txt", Buffer.buffer("Hello"), result -> { if (result.succeeded()) { System.out.println("File written"); } else { System.err.println("Oh oh ..." + result.cause()); } }); // Check existence and delete vertx.fileSystem().exists("target/classes/junk.txt", result -> { if (result.succeeded() && result.result()) { vertx.fileSystem().delete("target/classes/junk.txt", r -> { System.out.println("File deleted"); }); } else { System.err.println("Oh oh ... - cannot delete the file: " + result.cause()); } });
更多中文文檔: https://vertxchina.github.io/vertx-translation-chinese/core/Core.html