停止日食中的vertx verticle

2022-09-04 19:48:18

我正在遵循Jenkov关于vertx的教程。在这里,我有两个文件:

MyVerticle.java:

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;

public class MyVerticle extends AbstractVerticle {

    @Override
    public void start(Future<Void> startFuture) {
        System.out.println("MyVerticle started!");
    }

    @Override
    public void stop(Future stopFuture) throws Exception {
        System.out.println("MyVerticle stopped!");
    }
}

和 VertxVerticleMain.java:

import io.vertx.core.Vertx;

public class VertxVerticleMain {

    public static void main(String[] args) {
        Vertx vertx = Vertx.vertx();

        vertx.deployVerticle(new MyVerticle());
    }
}

运行后,我在Eclipse的控制台中看到,但不知道如何调用。VertxVerticleMain.java"MyVerticle started!"stopMyVerticle

Jenkov说,当Vert.x关闭并且你的顶点需要停止时,就会调用stop()方法。我究竟如何关闭我的Vert.x并停止这个顶点?我想在控制台中看到。MyVerticle stopped!


答案 1

来自 Vert.x 文档

Vert.x calls this method when un-deploying the instance. You do not call it yourself. 

如果您从主方法运行 Vert.x 并终止 JVM 进程(例如,通过单击 Eclipse 中的“停止”按钮),则 Vert.x 可能不会发出取消部署顶点的信号,或者 JVM 在 Vert.x 有时间取消部署顶点之前终止。

您可以执行许多操作来确保取消部署顶点并调用 stop() 方法:

  1. 使用 vertx 命令行启动 Verticle。当您停止进程(或告诉 vert.x 停止)时,Vert.x 将确保所有顶点都已取消部署。
  2. 您可以通过获取 deploymentId 的列表并调用所有 id 的取消部署来以编程方式取消部署已部署的顶点:

    vertx.deploymentIDs().forEach(vertx::undeploy);
    
  3. 你可以以编程方式告诉 Vert.x 停止:

    vertx.close();
    
  4. 您可以添加一个关机钩子,以确保在 JVM 终止时执行上述选项之一:

    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            vertx.close();
        }
    });
    

您可以通过调用 Vert.x API 以编程方式取消部署顶点,也可以直接停止 Java 进程,这实际上会触发 Vert.x 进程停止。

顺便说一句,值得问问自己,当运行顶点的进程停止时,是否确实有必要始终调用stop()方法。你永远无法确定这种情况会发生;当进程被迫停止或终止时,可能不会调用 stop() 方法。


答案 2

你的代码应该添加 super.stop() 和 super.start() 函数,如下所示:

public class MyVerticle extends AbstractVerticle {

    @Override
    public void start(Future<Void> startFuture) {
        //must call super.start() or call startFuture.complete()
        super.start(startFuture); 
        System.out.println("MyVerticle started!");
        System.out.println("Verticle_stopFuture.start(): deployId=" + context.deploymentID());
    }

    @Override
    public void stop(Future stopFuture) throws Exception {
        //must call super.stop() or call stopFuture.complete()
        super.stop(stopFuture);
        System.out.println("MyVerticle stopped!");
    }
}

和 VertxVerticleMain.java:

public class VertxVerticleMain {
    static String verticle_deployId;

    public static void main(String[] args) throws InterruptedException {
        System.out.println("start main(): thread="+Thread.currentThread().getId());


        Vertx vertx = Vertx.vertx();

        vertx.deployVerticle(new MyVerticle(), new Handler<AsyncResult<String>>(){

            @Override
            public void handle(AsyncResult<String> asyncResult) {

                if (asyncResult.succeeded()) { // khi startFuture.complete() đc gọi
                    System.out.println("asyncResult = DeployId =" + asyncResult.result());

                    verticle_deployId = asyncResult.result();
                } else { //khi startFuture.fail() đc gọi
                    System.out.println("Deployment failed!");  //vì chưa đc cấp id
                }
            }
        });

        // waiting for Verticle context is allocate by Vertx
        Thread.currentThread().sleep(500);

        Set<String> deploymentIDs = vertx.deploymentIDs();
        System.out.println("==============  (sleeped 500ms wait for Context allocated), list of deploymentIDs: number Deployments =" + deploymentIDs.size());
        for(String depId: deploymentIDs){
            //
            System.out.println(depId);
        }

        //close verticle here
        vertx.undeploy(verticle_deployId);


    }

}

推荐