我对vert.x完全陌生,我用JavaScript编写了一个hello world程序:
console.log("Hello, World");
当我从linux命令行运行程序时(在旧的ubuntu开发系统上,如果它很重要),程序运行但从不退出:
hostname$ ./node_modules/.bin/vertx run server.js
Hello, World
Succeeded in deploying verticle
^Chostname$
我必须按CTRL-C才能终止进程,这似乎是错误的。在我们的生产环境中,流程最好在完成后退出。
我发现了这个:http://vertx.io/docs/vertx-core/java/#_causing_vert_x_to_exit,所以我添加了对vertx.close
方法的调用:
console.log("Hello, World");
vertx.close( function onClose() {
console.log("Goodbye, cruel world.");
});
在调用onClose
函数时,进程不会退出:
hostname$ node_modules/.bin/vertx run server.js
Hello, World
Succeeded in deploying verticle
Goodbye, cruel world.
^Chostname$
我也按照https://groups.google.com/forum/#!topic/vertx/5ROEKq4STEw的建议尝试了vertx.exit()
,但过程仍未退出。
最后,我发现这个讨论(https://groups.google.com/forum/#!topic/vertx/L2r1NUvJcXs)在linux上运行时似乎包含了一个用于vert.x的Java代码补丁,但这看起来非常严厉。
以下是可能有些好奇的人的版本号列表:
hostname$ node_modules/.bin/vertx -version
3.0.0
hostname$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) Server VM (build 25.91-b14, mixed mode)
hostname$ uname -a
Linux hostname 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:42:40 UTC 2014 i686 athlon i386 GNU/Linux
hostname$
以后有几次谷歌尝试失败,我要求SO寻求帮助。我在这里做错了什么?
[POSTSCRIPT]
所以它看起来像我TL; DR' Java代码补丁"在https://groups.google.com/forum/#!topic/vertx/L2r1NUvJcXs。关键的代码是:
System.exit(0);
像魅力一样工作。我在这里张贴这个,供别人学习我的错误。 尴尬脸红
答案 0 :(得分:0)
我认为vert.x不打算像这样在批处理模式下运行。 Vert.x提供了一个处理事件的运行时环境。它提供了可用于处理事件的事件循环。
查看此演示文稿,它非常清楚地解释了vert.x的核心概念:https://www.youtube.com/watch?v=qL5BGHPXrac。
Vert.x在java中实现,当你像这样启动vertx时,你启动jvm,它执行vertx core,然后执行你的javascript。问题是,我认为你无法从你的javascript文件访问java执行环境。
如果你愿意写一点java代码,我给你写了一个可能的解决方案:https://github.com/floriankammermann/vertx-examples/tree/master/self-terminating
请注意,如果需要在Verticle之间进行通信,则必须每次通过eventbus进行通信
答案 1 :(得分:0)
当我延长AbstractVerticle
时,例如:public class MainVerticle extends AbstractVerticle
我可以使用:
this.getVertx().close();
引用:Vert.x Core Manual,Causing Vert.x to exit
Vert.x实例维护的线程不是守护程序线程,因此它们会阻止JVM退出。
如果您正在嵌入Vert.x并且已完成它,则可以调用close
将其关闭。
这将关闭所有内部线程池并关闭其他资源,并允许JVM退出。
请记住,如果你的Verticle有简单的同步清理任务要完成,那么重写stop
方法并将你的清理代码放在这里。
@Override
public void stop() {
System.out.println("stopping...");
}