我有一个简单的问题 - 是否有人试图在集群中运行Vert.x 2和Vert.x 3应用程序,通过EventBus进行通信?
理论上它应该是可能的但有人做过吗?;)
干杯, 米哈尔
答案 0 :(得分:3)
对于3.3版本,Vert.x正在向2.x系列添加一个新模块。这个新组件是mod-eventbus3-bridge-client
。
我们的想法是,您可以在现有的2.x应用程序中部署此模块,它将在eventbus 2.x和eventbus 3.x之间架起桥梁。
您可以在以下位置查看代码:https://github.com/vert-x/mod-eventbus3-bridge-client/tree/initial-work
所以在Vert.x3中你需要这样做:
public class Example {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
TcpEventBusBridge bridge = TcpEventBusBridge.create(
vertx,
new BridgeOptions()
.addInboundPermitted(new PermittedOptions())
.addOutboundPermitted(new PermittedOptions()));
bridge.listen(7000, res -> {
// example: vertx3 send a message to vertx2
vertx.eventBus().send("send3", new JsonObject().put("msg", "hello send"));
});
}
}
在Vert.x2上你会做相反的事情:
public class Example extends Verticle {
@Override
public void start() {
final EventBus3 eb = new EventBus3(vertx, getContainer().config(), new Handler<Void>() {
@Override
public void handle(Void done) {
// case #1 vertx3 send a message to vertx2
eb.registerHandler("send3", new Handler<BridgeMessage>() {
@Override
public void handle(BridgeMessage msg) {
System.out.println(msg.body());
}
});
}
});
eb.exceptionHandler(new Handler<Throwable>() {
@Override
public void handle(Throwable throwable) {
throwable.printStackTrace();
}
});
}
}
答案 1 :(得分:1)
我非常感谢这个问题,因为当我决定将 2.x 应用程序升级到最新版本的 Vert.x 时,我个人也有同样的想法。 ,即 3.x 。
我猜你暴露出这样的问题,因为节点间/模块间通信协议至少应该在某种程度上兼容,EventBus
已经是典型的 Vert.x 应用程序,即使在不同的模块版本之间,也应该抽象出消息传输。
同时我不知道任何主要版本之间提供API兼容性的开源产品,因为主要版本通常表示“API将更改”。 Vert.x 应该没有例外,并且毫不奇怪,在不同版本中开发的Verticle /模块之间的通信可能会失败,因此即使不值得测试,也应该避免这种方法。 / p>
答案 2 :(得分:-1)
我在群集中尝试了Vert.x2和Vert.x3 EventBus。但不是在同一时间。 Vert.x2需要jdk 1.7和Vert.x3需要jdk 1.8或更高版本。我试图在jdk 1.8中运行Vert.x2,但那并没有成功。
因此,我认为在集群中运行Vert.x2和Vert.x3应用程序是不可能的。