【java】vertx从入门到放弃——入门(二)Verticle

什么是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部署相关的内容,有疑问可以留言讨论,因为我也是在探索的过程中~

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zcrazy胡说八道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值