java - 在 Eclipse 中停止 vertx verticle

标签 java eclipse vertx3 vert.x

我正在关注 Jenkov's tutorial在顶点上。这里我有两个文件:

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());
    }
}

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

Jenkov 说当 Vert.x 关闭并且您的 Verticle 需要停止时调用 stop() 方法。我该如何关闭我的 Vert.x 并停止这个 Verticle?我想在控制台中看到 MyVerticle stopped!

最佳答案

来自 the Vert.x docs :

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

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

您可以做很多事情来确保 Verticle 将被取消部署并调用 stop() 方法:

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

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

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

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

您可以通过调用 Vert.x API 以编程方式取消部署 Verticle,或者只是停止 Java 进程,这会触发 Vert.x 进程停止。

顺便问一下,当运行 Verticle 的进程停止时,是否真的有必要始终调用 stop() 方法。您永远无法确定会发生这种情况;当进程被强制停止或杀死时,可能不会调用 stop() 方法。

关于java - 在 Eclipse 中停止 vertx verticle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36389308/

相关文章:

java - 用Java将流写入mongoDB

c++ - 使 : g++: Command not found

vert.x 使用多个处理程序

java - 使用 MapStruct 将新子实体添加到托管实体

java - 如何在 Swing 中获取可访问父级(面板)的名称?

java - Alfresco maven sdk错误

java - 如何从依赖项中删除确切的用法?

java - 在 Redis 中存储带有时间戳的值列表

java - 如何将我的变量放入对象的构造函数中

java - Scalatra 独立部署时找不到 View