Vertx 3:取消部署在不同 JVM 实例中 运行 的 Verticles
Vertx 3 : Undeploy verticles which are running in different JVM instance
我有两个顶点说 "A" 和 "B"。两者在不同的 JVM 实例中都是 运行。
现在,A 向 B "Operation successful. You can undeploy yourself" 发送消息。当 B 收到此消息时,它应该自行取消部署。
我尝试了两种选择:
1. vertx.close();
(a) 如果 Verticle B 在不同的命令提示符下打开。
(b) 如果 Verticle B 没有在不同的命令提示符下打开。
2. vertx.undeploy(deploymentID(),); Verticle B 打开为不同的 cmd 提示符以及相同的 cmd 提示符(Verticle cmd 提示符...在后台运行)
在1->(a)中,关闭了Verticle B,但cmd提示符仍然打开。
1->(b)中,Verticle B没有关闭,JVM也是运行。
在第二种情况下,我收到以下错误消息:
java.lang.IllegalStateException: Unknown deployment
at io.vertx.core.impl.DeploymentManager.undeployVerticle(DeploymentManager.java:203)
at io.vertx.core.impl.VertxImpl.undeploy(VertxImpl.java:587)
at x.y.z.AVerticle.lambda$null(AVerticle.java:118)
at io.vertx.core.eventbus.impl.EventBusImpl.lambda$convertHandler(EventBusImpl.java:334)
at io.vertx.core.eventbus.impl.HandlerRegistration.deliver(HandlerRegistration.java:213)
at io.vertx.core.eventbus.impl.HandlerRegistration.handle(HandlerRegistration.java:192)
at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler(EventBusImpl.java:503)
at io.vertx.core.impl.ContextImpl.lambda$wrapTask(ContextImpl.java:359)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:339)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:393)
at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:742)
at java.lang.Thread.run(Unknown Source)
有人知道怎么做吗?
谢谢:)
我举了一个类似的例子,要求取消部署然后终止 jvm。
https://github.com/floriankammermann/vertx-examples/tree/master/self-terminating
您也可以使用此代码。您只需删除 https://github.com/floriankammermann/vertx-examples/blob/master/self-terminating/src/main/java/org/swisspush/vertx/examples/SelfTerminated.java
中的 System.exit(0);
这里的一个限制是,您也必须以编程方式部署 Verticle。
在您的情况下,verticle A 和 B 必须通过分布式事件总线连接(可以相互发送消息)。 Verticle doSomething.js 是您的情况下的 Verticle B。 Verticle A 的部署位置无关紧要。 Verticle A 唯一要做的事情就是 send/publish 向地址 "finished" 发送一条消息。这将取消部署 Verticle B。
我有两个顶点说 "A" 和 "B"。两者在不同的 JVM 实例中都是 运行。 现在,A 向 B "Operation successful. You can undeploy yourself" 发送消息。当 B 收到此消息时,它应该自行取消部署。
我尝试了两种选择: 1. vertx.close(); (a) 如果 Verticle B 在不同的命令提示符下打开。 (b) 如果 Verticle B 没有在不同的命令提示符下打开。 2. vertx.undeploy(deploymentID(),); Verticle B 打开为不同的 cmd 提示符以及相同的 cmd 提示符(Verticle cmd 提示符...在后台运行)
在1->(a)中,关闭了Verticle B,但cmd提示符仍然打开。 1->(b)中,Verticle B没有关闭,JVM也是运行。 在第二种情况下,我收到以下错误消息:
java.lang.IllegalStateException: Unknown deployment
at io.vertx.core.impl.DeploymentManager.undeployVerticle(DeploymentManager.java:203)
at io.vertx.core.impl.VertxImpl.undeploy(VertxImpl.java:587)
at x.y.z.AVerticle.lambda$null(AVerticle.java:118)
at io.vertx.core.eventbus.impl.EventBusImpl.lambda$convertHandler(EventBusImpl.java:334)
at io.vertx.core.eventbus.impl.HandlerRegistration.deliver(HandlerRegistration.java:213)
at io.vertx.core.eventbus.impl.HandlerRegistration.handle(HandlerRegistration.java:192)
at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler(EventBusImpl.java:503)
at io.vertx.core.impl.ContextImpl.lambda$wrapTask(ContextImpl.java:359)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:339)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:393)
at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:742)
at java.lang.Thread.run(Unknown Source)
有人知道怎么做吗? 谢谢:)
我举了一个类似的例子,要求取消部署然后终止 jvm。
https://github.com/floriankammermann/vertx-examples/tree/master/self-terminating 您也可以使用此代码。您只需删除 https://github.com/floriankammermann/vertx-examples/blob/master/self-terminating/src/main/java/org/swisspush/vertx/examples/SelfTerminated.java
中的System.exit(0);
这里的一个限制是,您也必须以编程方式部署 Verticle。
在您的情况下,verticle A 和 B 必须通过分布式事件总线连接(可以相互发送消息)。 Verticle doSomething.js 是您的情况下的 Verticle B。 Verticle A 的部署位置无关紧要。 Verticle A 唯一要做的事情就是 send/publish 向地址 "finished" 发送一条消息。这将取消部署 Verticle B。