Verticles目錄大綱
- Verticle是什么
- 編寫(xiě)Verticle
- 異步Verticle的啟動(dòng)與停止
- Verticles類型
- 普通的Verticles
- 工作者Verticles
- 編程部署Verticles
- Verticle名稱對(duì)應(yīng)Verticle工廠的映射規(guī)則
- 如何定位Verticle工廠
- 等待部署完成
- 卸載Verticle部署
- 指定Verticle的實(shí)例數(shù)量
- 將配置傳遞給Verticle
- 在Verticle里面訪問(wèn)環(huán)境變量
- Verticle隔離組
- 高可用
- 命令行方式運(yùn)行Verticles
- 引起Verticle退出
- 上下文對(duì)象
- 執(zhí)行周期調(diào)度和延時(shí)動(dòng)作
- Verticle工作池
Verticles是什么
Vert.x 提供了一個(gè)簡(jiǎn)單的,可伸縮的,類似actor的部署和并發(fā)模型艘希,你可以使用它來(lái)編寫(xiě)自己的代碼。
這個(gè)模式是可選的翘贮,如果你不想要使用這種模式,Vert.x 也不會(huì)強(qiáng)求你非用這種模式不可爆惧。
該模型并沒(méi)有聲稱是一個(gè)嚴(yán)格的角色模型實(shí)現(xiàn)狸页,但它確實(shí)有共同點(diǎn),特別是在并發(fā)性扯再,擴(kuò)展性和部署方面芍耘。
要使用這個(gè)模型,你需要將你的代碼設(shè)置為verticles叔收。
Verticles的代碼是通過(guò)Vert.x來(lái)運(yùn)行和部署的齿穗。一個(gè)Vert.x實(shí)例默認(rèn)維護(hù)了N個(gè)線程循環(huán)(event loop)線程(N默認(rèn)是內(nèi)核數(shù)量*2)傲隶。Verticles能夠用Vert.x支持的任何語(yǔ)言饺律,一個(gè)應(yīng)用程序也可以使用多種語(yǔ)言來(lái)編寫(xiě)verticles。
你可以把Verticle作為一個(gè) actor模型 中的actor跺株。
一個(gè)應(yīng)用程序通常同一時(shí)刻由許多verticle實(shí)例運(yùn)行在相同的Vert.x實(shí)例中复濒。
應(yīng)用程序通常由同一個(gè)Vert.x實(shí)例中同時(shí)運(yùn)行多個(gè)verticle實(shí)例組成。
應(yīng)用程序由...組成乒省。
多個(gè)verticle實(shí)例運(yùn)行
在同一個(gè)Vert.x實(shí)例
應(yīng)用程序通常由多個(gè)Verticle實(shí)例同一時(shí)間在Vert.x實(shí)例中運(yùn)行組成巧颈。(ps:也就是一個(gè)Vert.x內(nèi)包含了多個(gè)Verticle實(shí)例對(duì)象)。不同的verticle實(shí)例彼此交互發(fā)送消息通過(guò) event bus袖扛。
編寫(xiě)Verticle
Verticle類必須要實(shí)現(xiàn) Verticle 接口砸泛。
如果你不想直接實(shí)現(xiàn)這個(gè)接口,通常繼承至抽象類 AbstractVerticle 更簡(jiǎn)單哦蛆封。
下面舉個(gè)verticle的栗子:
public class MyVerticle extends AbstractVerticle {
// Called when verticle is deployed
public void start() {
}
// Optional - called when verticle is undeployed
public void stop() {
}
}
通常和上文舉的栗子一樣你可能會(huì)覆蓋 start 方法唇礁。
當(dāng) Vert.x 部署verticle時(shí)它會(huì)調(diào)用 start 方法,然后當(dāng)方法已經(jīng)完成后惨篱,verticle會(huì)考慮啟動(dòng)它盏筐。
你也可以選擇覆寫(xiě) stop 方法(可根據(jù)自己的需求來(lái)是否選擇覆寫(xiě)該方法)。當(dāng) verticle 卸載的時(shí)候 stop 方法將會(huì)被調(diào)用砸讳,當(dāng)這個(gè)方法已經(jīng)完成琢融,verticle將會(huì)考慮進(jìn)行停止它界牡。
異步Verticle的啟動(dòng)與停止
有時(shí)候你想在 verticle 啟動(dòng)中搞一些事情,這需要花些時(shí)間漾抬,在這種情況下你不喜歡 verticle 被部署宿亡。例如,你可能想要在 start 方法調(diào)用的時(shí)候部署其它的 verticle 纳令。
在你的啟動(dòng)方法中你不能阻塞其它的verticle部署因?yàn)檫@可能會(huì)打破 黃金法則(Golden Rule) 她混。
因此如何是好呢?
這個(gè)方法就是實(shí)現(xiàn)異步 start 方法泊碑。這個(gè) 異步(asynchronous ) 方法使用 Future 作為一個(gè)參數(shù)坤按。當(dāng)這個(gè)方法返回時(shí),verticle不會(huì)被考慮部署馒过。
一段時(shí)間后臭脓,你已經(jīng)完成了你所需要做的任何事情(例如:?jiǎn)?dòng)其它的 verticles ),你可以調(diào)用 Future 對(duì)象的 complete 方法(或者 fail 方法)通知你已經(jīng)完成了腹忽。
舉個(gè)栗子:
public class MyVerticle extends AbstractVerticle {
public void start(Future<Void> startFuture) {
// Now deploy some other verticle:
vertx.deployVerticle("com.foo.OtherVerticle", res -> {
if (res.succeeded()) {
startFuture.complete();
} else {
startFuture.fail(res.cause());
}
});
}
}
同樣的来累,這里也有一個(gè)異步版本的 stop 方法。你可以使用它來(lái)做一些 verticle 的耗時(shí)清理工作窘奏。
public class MyVerticle extends AbstractVerticle {
public void start() {
// Do something
}
public void stop(Future<Void> stopFuture) {
obj.doSomethingThatTakesTime(res -> {
if (res.succeeded()) {
stopFuture.complete();
} else {
stopFuture.fail();
}
});
}
}
提示:在 verticle 的停止方法里面嘹锁,你無(wú)需手動(dòng)卸載通過(guò) verticle 部署的子 verticle。當(dāng)父verticle卸載的時(shí)候着裹,Vert.x 會(huì)自動(dòng)卸載任何掛載在上面的子 verticle领猾。
Verticle類型
這里有3種不同類型的verticle:
Standard Verticles
這是最常見(jiàn)和通用的類型-他們總是使用一個(gè) event loop thread(事件循環(huán)線程) 執(zhí)行。
我們將會(huì)在接下來(lái)的章節(jié)繼續(xù)討論骇扇。
Worker Verticles
使用來(lái)自 worker pool(工作者線程池) 中的線程運(yùn)行摔竿。一個(gè)實(shí)例永遠(yuǎn)不會(huì)被多個(gè)線程同時(shí)執(zhí)行。
Multi-threaded worker verticles
使用來(lái)自 worker pool(工作者線程池) 中的線程運(yùn)行少孝。一個(gè)實(shí)例可以被多個(gè)線程同時(shí)執(zhí)行继低。
Standard verticles
Standard verticles 在創(chuàng)建時(shí)被分配一個(gè) 事件循環(huán)線程(event loop),并且使用該事件循環(huán)調(diào)用 start 方法稍走。當(dāng)你從事件循環(huán)上獲取核心API的處理程序調(diào)用其它任何方法的時(shí)候袁翁,Vert.x 保證這些處理程序在調(diào)用時(shí)將在相同的 事件循環(huán)線程(event loop) 中執(zhí)行。
這意味著我們可以保證你的 Verticle 實(shí)例中的所有代碼總是在相同的 事件循環(huán)線程(event loop) 上執(zhí)行的婿脸。(只要你不創(chuàng)建自己的線程并調(diào)用它A皇ぁ)。
這意味著你的應(yīng)用可以用一個(gè)線程編寫(xiě)所有的代碼盖淡,然后讓 Vert.x 處理線程與擴(kuò)展的問(wèn)題年柠。然后媽媽再也不用擔(dān)心你現(xiàn)有的項(xiàng)目與傳統(tǒng)的多線程應(yīng)用出現(xiàn)的同步和變量可見(jiàn)性問(wèn)題了,同時(shí)還能避免線程的競(jìng)爭(zhēng)與死鎖的問(wèn)題。
Worker verticles
Worker verticle 其實(shí)和 Standard verticle差不多冗恨,但是它不是使用 事件循環(huán)(event loop) 線程來(lái)執(zhí)行的答憔,它主要使用一個(gè)來(lái)自 Vert.x 工作線程池(worker thread pool) 中的線程來(lái)執(zhí)行的。
Worker verticles 主要是為調(diào)用阻塞代碼而設(shè)計(jì)的掀抹,所以它并不會(huì)阻塞 事件循環(huán)線程(event loop)虐拓。
如果你想使用一個(gè) worker verticle 運(yùn)行阻塞代碼,你還可以在 事件循環(huán)(event loop) 上面直接運(yùn)行內(nèi)部阻塞代碼傲武。
如果你想要部署一個(gè)worker verticle蓉驹,你需要設(shè)置 setWorker:
DeploymentOptions options = new DeploymentOptions().setWorker(true);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);
Worker verticle 實(shí)例永遠(yuǎn)不會(huì)由Vert.x的多個(gè)線程并發(fā)執(zhí)行,但是它可以被不同的線程在不同的時(shí)間執(zhí)行揪利。
Multi-threaded worker verticles
Multi-threaded worker verticle 和普通的 worker verticle差不多态兴,但是它可以被不同的線程并發(fā)執(zhí)行。
警告Multi-threaded worker verticles 是一個(gè)高級(jí)特性疟位,以至于大多數(shù)應(yīng)用可能不需要它瞻润。因?yàn)檫@些Verticle中的并發(fā)性,您必須非常小心地使用標(biāo)準(zhǔn)的Java技術(shù)來(lái)保持Verticle處于一致的狀態(tài)甜刻,以便進(jìn)行多線程編程绍撞。
編程實(shí)現(xiàn)部署
你可以使用 deployVerticle 方法來(lái)部署一個(gè) verticle,可以指定一個(gè) verticle 的名稱或者傳遞一個(gè)你創(chuàng)建好的 verticle 實(shí)例對(duì)象得院。
注意:僅支持Java部署Verticle實(shí)例.
Verticle myVerticle = new MyVerticle();
vertx.deployVerticle(myVerticle);
同樣你還可以通過(guò)指定 verticle 的 名稱(name) 來(lái)部署傻铣。
verticle的名稱是用來(lái)查找用于真正實(shí)例化 verticle 對(duì)象 VerticleFactory 工廠。
不同的 Verticle 工廠可用于實(shí)例化不同語(yǔ)言的 Verticle祥绞,也可用于其它各種方面非洲,例如加載服務(wù)以及在運(yùn)行時(shí)從Maven獲取 Verticle。
這種特性允許你部署 Vert.x 支持任何語(yǔ)言開(kāi)發(fā)的verticle就谜。
不同類型的 Verticle 部署怪蔑,舉個(gè)栗子:
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle");
// Deploy a JavaScript verticle
vertx.deployVerticle("verticles/myverticle.js")
// Deploy a Ruby verticle veticle
vertx.deployVerticle("verticles/my_verticle.rb");
Verticle名稱對(duì)應(yīng)Verticle工廠的映射規(guī)則
當(dāng)使用名稱部署 verticle 的時(shí)候,這個(gè) 名稱(name) 用來(lái)查找真正實(shí)例化 verticle 對(duì)象的 verticle 工廠丧荐。
Verticle 的名稱能夠根據(jù)前綴的方式來(lái)查找對(duì)應(yīng)的Verticle工廠,例如:
js:foo.js // 使用 JavaScript Verticle 工廠
groovy:com.mycompany.SomeGroovyCompiledVerticle // 使用Groovy verticle 工廠
service:com.mycompany:myorderservice // 使用 service verticle工廠
如果沒(méi)有設(shè)置前綴喧枷,Vert.x 將會(huì)根據(jù)后綴名來(lái)查找對(duì)應(yīng)的工廠虹统,例如:
foo.js // 將使用 JavaScript Verticle 工廠
SomeScript.groovy // 將使用Groovy Verticle 工廠
如果在沒(méi)有前綴和后綴的情況下,Vert.x 將會(huì)嘗試以 Java完全限定類名(FQCN)并實(shí)例化隧甚。
如何定位Verticle工廠
大多數(shù)的 Verticle 工廠都是從類路徑中加載并在 Vert.x 啟動(dòng)的時(shí)候注冊(cè)的车荔。
You can also programmatically register and unregister verticle factories using registerVerticleFactory and unregisterVerticleFactory if you wish.
如果你希望使用編程的方式注冊(cè)和注銷 verticle 工廠可以使用 registerVerticleFactory 和 unregisterVerticleFactory。
等待部署完成
Verticle是異步部署的戚扳,所以在調(diào)用部署后返回可能會(huì)需要一段時(shí)間忧便。
如果你想要在部署完成的時(shí)候被通知到,你可以指定一個(gè)完成的處理器:
vertx.deplyVerticle("com.mycompany.MyOrderProcessorVerticle", res -> {
if (res.succeeded()) {
System.out.println("Deplyment id is:" + res.result);
} else {
System.out.println("Deployment failed!");
}
});
如果部署成功的話帽借,這個(gè)完成處理器將會(huì)傳遞一個(gè)包含 string 類型的字符串部署 ID珠增。
這個(gè)部署ID可以用來(lái)你稍后卸載這個(gè)部署對(duì)象超歌。
卸載Verticle部署
取消部署可以通過(guò) undeploy 方法來(lái)卸載。
取消部署同樣是異步處理的蒂教,所以你想要在取消部署完成的時(shí)候收到通知處理巍举,你需要指定一個(gè)完成處理器:
vertx.undeploy(deploymentID, res -> {
if (res.succeeded()) {
System.out.println("Undeployed ok");
} else {
System.out.println("Undeployed failed!");
}
});
指定Verticle的實(shí)例數(shù)量
當(dāng)使用verticle名稱不是一個(gè)verticle的時(shí)候,你可以指定你想要部署的verticle實(shí)例的數(shù)量:
DeploymentOptions options = new DeploymentOptions().setInstances(16);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);
這種方式對(duì)于多核擴(kuò)展非常輕松凝垛。例如:你有一個(gè) web-server verticle 部署在一臺(tái)多核心的機(jī)器上面懊悯,這時(shí)你想要部署多個(gè)實(shí)例以便充分利用所有的核心,這時(shí)它并可以大展手腳了梦皮。
將配置傳遞給Verticle
可以在部署的時(shí)候?qū)SON形式的配置傳遞給Verticle:
JsonObject config = new JsonObject().put("name", "tim").put("directory", "/blah");
DeploymentOptions options = new DeploymentOptions().setConfig(config);
vertx.deployVerticle("com.mycompany.MyOrderProcessVerticle", options);
之后可以通過(guò) Context 對(duì)象或直接使用 config 方法來(lái)獲得此配置炭分。
配置文件返回一個(gè)JSON對(duì)象,因此你可以使用下面的這種方式獲取數(shù)據(jù):
System.out.println("Configuration: " + config().getString("name"));
在Verticle里面訪問(wèn)環(huán)境變量
使用Java API可以訪問(wèn)環(huán)境變量和系統(tǒng)屬性:
System.getProperty("prop");
System.getenv("HOME");
Verticle隔離組
默認(rèn)情況下剑肯,Vert.x 有一個(gè) 扁平類路徑(flag classpath)欠窒。也就是說(shuō),當(dāng) Vert.x 使用當(dāng)前類加載器部署 Verticle 時(shí)退子,它不會(huì)創(chuàng)建一個(gè)新的 classloader岖妄。多數(shù)情況下,這是最簡(jiǎn)單寂祥,最清楚荐虐,最令人激動(dòng)的事情。
但是, 在某些情況下, 你可能希望部署一個(gè) Verticle, 以便該 Verticle 的類與應(yīng)用程序中的其他類隔離開(kāi)來(lái)丸凭。
情況可能是這樣的福扬,例如:你想要在同一個(gè) Vert.x 實(shí)例中部署兩個(gè)同名不同版本的 verticle 實(shí)例,或者你有兩個(gè)不同版本但是卻使用相同的 jar 庫(kù)惜犀。
當(dāng)你想要使用隔離組時(shí)铛碑,設(shè)置 setIsolatedClasses 并提供一個(gè)你想要隔離的類名列表。一條記錄能夠以全限定類名類似 com.mycompany.myproject.engine.MyClass
或者以通配符的方式匹配在包中和子包下面的任何類虽界,例如:com.mycompany.myproject.*
將會(huì)匹配到在這個(gè)包 com.mycompany.myproject
及其子包下面的任何類汽烦。
請(qǐng)注意只有匹配到的類才會(huì)被隔離 - 任何其它的類將會(huì)使用當(dāng)前的類加載器進(jìn)行加載。
還可以使用 setExtraClasspath 提供額外的類路徑項(xiàng), 因此, 如果要加載在主類路徑中尚未存在的類或資源, 可以添加此項(xiàng)莉御。
警告:謹(jǐn)慎使用這個(gè)特性撇吞,
類加載器可能會(huì)出現(xiàn)一系列問(wèn)題并且還會(huì)增加調(diào)試的困難度,以及其它未知的事情發(fā)生礁叔。
舉個(gè)栗子說(shuō)明使用分離組部署verticle:
DeploymentOptions options = new DeploymentOptions().setIsolationGroup("mygorup");
options.setIsolatedClasses(Arrays.asList("com.mycompany.myverticle.*", "com.mycompany.somepkg.SomeClass", "org.somelibrary.*"));
vertx.deployVerticle("com.mycompany.myverticle.VerticleClass", options);
高可用
可以在部署Verticle的情況下啟用高可用性(HA)牍颈。 啟用高可用的情況下,當(dāng) Vert.x 實(shí)例上部署的 Verticle 突然宕機(jī)琅关,Verticle 會(huì)自動(dòng)從集群中重新部署到另一個(gè) Vert.x 實(shí)例以保證其服務(wù)繼續(xù)運(yùn)行煮岁。
以高可用的方式運(yùn)行 verticle,只需要添加 -ha
開(kāi)關(guān)即可:
vertx run my-verticle.js -ha
當(dāng)開(kāi)啟了高可用性,就無(wú)需追加 -cluster
画机。
更多關(guān)于高可用特性和配置在高可用和故障轉(zhuǎn)移章節(jié)冶伞。
命令行方式運(yùn)行Verticles
你可以在Maven或者Gradle項(xiàng)目中添加 Vert.x cor庫(kù)的依賴之后并可以直接使用它。
然而你可能還想要從命令行來(lái)直接運(yùn)行 Vert.x verticles色罚。
如果你要這樣搞的話碰缔,首先你需要下載安裝 Vert.x 發(fā)布包,然后增加 安裝的 bin
到你系統(tǒng)的 PATH
環(huán)境變量戳护。同時(shí)確保 Java 8 JDK也同樣在你的系統(tǒng)環(huán)境變量中金抡。
注意:JDK要求支持代碼的即時(shí)編譯。
現(xiàn)在你可以使用 vert.x 運(yùn)行命令來(lái)運(yùn)行 verticles腌且。舉個(gè)栗子:
# Run a JavaScript verticle
vertx run my_verticle.js
# Run a Ruby verticle
vertx run a_n_other_verticle.rb
# Run a Groovy script verticle, clustered
vertx run FooVerticle.groovy -cluster
你甚至可以運(yùn)行Java源代碼而無(wú)需先編譯它們梗肝!
vertx run SomeJavaSourceFile.java
運(yùn)行Vert.x之前,Vert.x將立即編譯Java源文件铺董。 這對(duì)快速構(gòu)建Verticle原型非常有用巫击,而且對(duì)于演示非常有用。 再也不用先建立一個(gè)Maven或Gradle項(xiàng)目來(lái)開(kāi)始了精续!
獲取所有的 vert.x
執(zhí)行命令行的變量選項(xiàng)坝锰,在命令行上輸入 vertx
即可。
引起Verticle退出
由于Vert.x 的實(shí)例線程不是守護(hù)線程重付,因此它們會(huì)阻止JVM退出顷级。
如果你正在嵌入Vert.x,并且已經(jīng)完成了确垫,你可以調(diào)用 close 來(lái)關(guān)閉它弓颈。
它會(huì)關(guān)閉所有的內(nèi)部線程池并清理其它資源,然后允許JVM退出删掀。
上下文對(duì)象
當(dāng) Vert.x 向處理程序提供事件或調(diào)用 Verticle 的啟動(dòng)或停止方法時(shí)翔冀,執(zhí)行與Context相關(guān)聯(lián)。 通常披泪,上下文是一個(gè)事件循環(huán)上下文纤子,并綁定到特定的事件循環(huán)線程。 所以這個(gè)上下文的執(zhí)行總是發(fā)生在完全相同的事件循環(huán)線程上付呕。 在工作者 Verticle 和運(yùn)行內(nèi)聯(lián)阻塞代碼的情況下计福,工作者上下文將與將使用來(lái)自工作者線程池的線程的執(zhí)行相關(guān)聯(lián)。
要想獲得 上下文(context) ,使用 getOrCreateContext 方法:
Context context = vertx.getOrCreateContext();
如果當(dāng)前的線程已經(jīng)關(guān)聯(lián)了上下文徽职,它將重用該上下文對(duì)象。如果創(chuàng)建的上下文對(duì)象不是新的實(shí)例佩厚。你可以測(cè)試您檢索的上下文類型:
Context context = vertx.getOrCreateContext();
if (context.isEventLoopContext()) {
System.out.println("Context attached to Event Loop");
} else if (context.isWorkerContext()) {
System.out.println("Context attached to Worker Thread");
} else if (context.isMultiThreadedWorkerContext()) {
System.out.println("Context attached to Worker Thread - multi thread worker");
} else if (!Context.isOnVertxThread()) {
System.out.println("Context not attached to a thread managed by vert.x");
}
當(dāng)你檢索到上下文時(shí)姆钉,你可以在上下文中異步運(yùn)行代碼。換而言之,你提交一個(gè)任務(wù)最終將會(huì)在同一個(gè)上下文中運(yùn)行潮瓶,但之后:
vertx.getOrCreateContext().runOnContext( (v) -> {
System.out.println("This will be executed asynchrously in the same context");
})
當(dāng)多個(gè) handlers 在同一個(gè)上下文中運(yùn)行陶冷,它們可能想要共享數(shù)據(jù)。上下文對(duì)象提供了存儲(chǔ)和檢索 方法來(lái)共享數(shù)據(jù)毯辅。例如埂伦,它可以讓你傳遞數(shù)據(jù)給一些使用 runOnContext 運(yùn)行的動(dòng)作:
final Context context = vertx.getOrCreateContext();
context.put("data", "hello");
context.runOnContext( (v) -> {
String hello = context.get("data");
});
上下文對(duì)象允許你使用 config 方法 訪問(wèn)verticle配置。查看 Passing cofniguration to a verticel 章節(jié)獲取更多關(guān)于配置的細(xì)節(jié)思恐。
執(zhí)行周期調(diào)度和延時(shí)動(dòng)作
在Vert.x 中想要執(zhí)行一個(gè)一次性動(dòng)作或者周期動(dòng)作是非常簡(jiǎn)單的事情沾谜。
在 標(biāo)準(zhǔn) verticle(standard verticle) 你不能讓線程休眠來(lái)做到延遲,因?yàn)檫@樣會(huì)阻塞 事件線程(event loop thread)胀莹。
你需要使用 Vert.x 的 timer 來(lái)取代它基跑。Timer 能夠一次性或者周期的執(zhí)行。我們將會(huì)討論下兩者描焰。
一次性定時(shí)器
一次性定時(shí)器在一定的延遲之后調(diào)用事件處理程序媳否,以毫秒表示。
設(shè)置一個(gè)定時(shí)器觸發(fā)荆秦,你需要設(shè)置 setTimer 方法然后傳入延遲時(shí)間和一個(gè)處理程序篱竭。
long timerID = vertx.setTimer(1000, id -> {
System.out.println("And one second later taht is printed");
});
System.out.println("First this is printed");
返回值是一個(gè)唯一的Timer id,它能夠在稍后的時(shí)間用于取消定時(shí)器步绸。handler 也同樣傳遞了這個(gè) timer id掺逼。
周期定時(shí)器
你可以設(shè)置定時(shí)器周期的執(zhí)行通過(guò) setPeriodic。
初始延遲時(shí)間等于周期調(diào)度時(shí)間靡努。
setPeriodic 的返回值是一個(gè)唯一的 timer id(long)坪圾。它能用于稍后的時(shí)間取消定時(shí)器。
傳遞給定時(shí)器事件處理程序的參數(shù)也是唯一的定時(shí)器ID:
請(qǐng)記住惑朦,計(jì)時(shí)器會(huì)定期啟動(dòng)。 如果您的定期處理需要很長(zhǎng)時(shí)間才能繼續(xù)漾月,那么您的計(jì)時(shí)器事件可能會(huì)持續(xù)運(yùn)行甚至更糟糕:疊加病梢。
在這種情況下梁肿,你應(yīng)該考慮使用 setTimer钮热。 一旦你的調(diào)度完成隧期,你可以設(shè)置下一個(gè)計(jì)時(shí)器宏蛉。
long timerID = vertx.setPeriodic(1000, id -> {
System.out.println("And every second this is printed");
});
System.out.println("First this is printed");
取消定時(shí)器
取消周期性的定時(shí)器,調(diào)用 cacelTimer 指定的定時(shí)器id性置。舉個(gè)栗子:
vertx.cancelTimer(timerID);
自動(dòng)卸載定時(shí)器
如果你從verticle的內(nèi)部創(chuàng)建的定時(shí)器拾并,那它們會(huì)自動(dòng)關(guān)閉當(dāng)verticle卸載的時(shí)候。
Verticle工作池
Verticle 使用 Vert.x 工作池(worker pool) 執(zhí)行阻塞動(dòng)作鹏浅,例如:executeBlocking 或者 worker verticle嗅义。
不同的是 worker pool 能夠在部署選項(xiàng)中指定不同的工作池:
vertx.deployVerticle("the-verticle", new DeploymentOptions().setWorkerPoolName("the-specific-pool"));
The end