什么是Verticle?我懒得解释,你可以自己去官网翻译,或者通过我下面的例子一步一步自己理解。
我在这就直接上代码,首先依旧是依赖
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>4.0.0</version>
</dependency>
然后一个简单的例子
package cn.zcrazy.giveupvertx;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
public class HelloVerticle extends AbstractVerticle {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle("cn.zcrazy.giveupvertx.HelloVerticle");
vertx.deployVerticle(new HelloVerticle());
}
@Override
public void start(){
System.out.println("Hello Verticle start!");
}
Verticle需要继承AbstractVerticle,AbstractVerticle中会有两个方法start和stop,顾名思义,start是部署时触发的方法,stop是停止Verticle时触发的方法。
代码中的main方法里面就是Verticle部署的方法,可以输入Verticle类的全路径名的字符串,也可以new出一个之后进行部署,两种方式皆可,上面代码运行之后控制台输出如下:
让例子变得稍微复杂一些,我们可以向Verticle中传递一些数据,例子如下:
package cn.zcrazy.giveupvertx;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject;
public class HelloVerticle extends AbstractVerticle {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
JsonObject config = new JsonObject().put("foo", "bar");
vertx.deployVerticle("cn.zcrazy.giveupvertx.HelloVerticle",new DeploymentOptions().setConfig(config));
}
@Override
public void start(){
System.out.println("Hello Verticle start!");
System.out.println("Config is " + config());
}
将部署参数在部署的时候作为参数传进去,然后在start中通过默认的config方法获取部署时传进去的参数。输出如下:
既然第二个例子里提到了部署参数,接下来就再来一个部署参数的例子,第一个例子中,我们用两种部署方式部署了两个Verticle实例,其实部署多少个Verticle实例在部署参数中是可以进行设置的,代码如下:
package cn.zcrazy.giveupvertx;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
public class HelloVerticle extends AbstractVerticle {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle("cn.zcrazy.giveupvertx.HelloVerticle",new DeploymentOptions().setInstances(10));
}
@Override
public void start(){
System.out.println("Hello Verticle start!");
}
输出如下:
这样就启动了10个相同的Verticle,至于作用是什么,在这里我就不详细说了,有可能之后会说。
部署结束之后,还可以有一些额外的动作,比如下面这个例子:
package cn.zcrazy.giveupvertx;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
public class HelloVerticle extends AbstractVerticle {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle("cn.zcrazy.giveupvertx.HelloVerticle",res -> {
if (res.succeeded()) {
String deploymentID = res.result();
System.out.println("Other verticle deployed ok, deploymentID = " + deploymentID);
} else {
res.cause().printStackTrace();
}
});
}
@Override
public void start(){
System.out.println("Hello Verticle start!");
}
部署之后如果成功则输出部署ID,失败则输出失败原因,控制台的输出如下:
这就类似一个等待部署结束的一个回调函数,获取部署的信息,进行处理。
Verticle自身也是有层级关系,可以在一个Verticle的方法中部署另一个Verticle,例子如下:
首先先创建一个新的Verticle
package cn.zcrazy.giveupvertx;
import io.vertx.core.AbstractVerticle;
public class WorldVerticle extends AbstractVerticle {
@Override
public void start(){
System.out.println(config().getString("Key")+" World!");
}
主Verticle如下:
package cn.zcrazy.giveupvertx;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject;
public class HelloVerticle extends AbstractVerticle {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle("cn.zcrazy.giveupvertx.HelloVerticle");
}
@Override
public void start(){
JsonObject config = new JsonObject();
config.put("Key","Hello");
vertx.deployVerticle("cn.zcrazy.giveupvertx.WorldVerticle",new DeploymentOptions().setConfig(config));
}
执行之后控制台输出如下:
既然有部署,那就会有取消部署,接下来我们来看看如何取消部署,例子依旧沿用上一个例子的两个Verticle,每一个都添加一个stop方法,代码如下:
package cn.zcrazy.giveupvertx;
import io.vertx.core.AbstractVerticle;
public class WorldVerticle extends AbstractVerticle {
@Override
public void start(){
System.out.println(config().getString("Key")+" World!");
}
@Override
public void stop(){
System.out.println("World Verticle Stop!");
}
package cn.zcrazy.giveupvertx;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject;
public class HelloVerticle extends AbstractVerticle {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle("cn.zcrazy.giveupvertx.HelloVerticle",res->{
if (res.succeeded()) {
String deploymentID = res.result();
vertx.undeploy(deploymentID, res2 -> {
if (res2.succeeded()) {
System.out.println("Undeployed ok!");
} else {
res2.cause().printStackTrace();
}
});
} else {
res.cause().printStackTrace();
}
});
}
@Override
public void start(){
JsonObject config = new JsonObject();
config.put("Key","Hello");
vertx.deployVerticle("cn.zcrazy.giveupvertx.WorldVerticle",new DeploymentOptions().setConfig(config));
}
@Override
public void stop(){
System.out.println("Hello Verticle Stop!");
}
启动之后的流程大致时,先部署HelloVerticle,在部署的过程中部署WorldVerticle,成功时候在HelloVerticle部署结束的回调函数中,取消部署HelloVerticle,这个时候你会发现,在取消部署HelloVerticle之前,他的子VerticleWorld先被取消部署了,控制台输出如下:
以上就是Verticle部署相关的内容,有疑问可以留言讨论,因为我也是在探索的过程中~