Vertx - This Route is exclusive for already mounted sub router 问题
Vertx - This Route is exclusive for already mounted sub router issue
我正在尝试创建 2 个 Verticle,一个用于 http 服务器,另一个用于我的 sockjs 事件总线桥。然后我试图在主应用程序中部署两个 Verticles。出于某种原因,我在 Sockjs Verticle 中收到此错误。
java.lang.IllegalStateException:此Route为已经挂载的子路由独享
Router router = Router.router(vertx);
vertx.deployVerticle(new RestApiVerticle(router))
.onFailure(startPromise::fail)
.onSuccess(id -> {
LOG.info("Deployed {} with id {}", RestApiVerticle.class.getSimpleName(), id);
startPromise.complete();
});
vertx.deployVerticle(new com.ali.websockjs.WebSocketVerticle(router))
.onFailure(startPromise::fail)
.onSuccess(id -> {
LOG.info("Deployed {} with id {}", com.ali.websockjs.WebSocketVerticle.class.getSimpleName(), id);
startPromise.complete();
});
在我的 RestApiVerticle 中
private Router router;
public RestApiVerticle(Router router) {
this.router = router;
}
router.route().handler(bodyHandler).failureHandler(FailureResponse.handleFailure());
router.route("/").handler(req -> req.response().end("Hello there!"))
.failureHandler(error -> LOG.error("Something is wrong with server!!"));
在我的 WebSocketVerticle 中,出现错误
private Router router;
public WebSocketVerticle(Router router) {
this.router = router;
}
Below code I get error
// mount the bridge on the router
router.mountSubRouter("/eventbus", subRouter).failureHandler(error -> LOG.error("error {}", error));
请帮忙!!!!!!
更新
按照您的方法在浏览器中出现 CORS 错误
Access to XMLHttpRequest at 'http://localhost:1234/eventbus/info?t=1653982669356' from origin 'http://localhost:4200' has been blocked by CORS policy:
vertx.deployVerticle(new RestApiVerticle(router))
.compose(var ->
vertx.deployVerticle(new WebSocketVerticle(router)))
.onFailure(startPromise::fail)
.onSuccess(server -> {
LOG.debug("Server and Sockjs started !!");
startPromise.complete();
});
有什么建议吗??
该错误告诉您您的设置存在配置问题。在某种程度上,这就是正在发生的事情:
你有一个路由器,在这个路由器中你有一个路由 /eventbus
将路由评估从第一个路由器传输到第二个(sockjs 路由器)。
您的代码似乎试图调用该设置两次。这意味着出了点问题。问题是,在给定的路由上,如果您将执行转移到第二个路由器,则永远不会调用第三个路由器(导致问题),因为处理现在正在第二个路由器上进行。
我想说的是,您可能需要调试应用程序启动并查看为什么多次调用设置。
我这里的假设是您看到的问题是由于部署中的竞争条件引起的。您正在呼叫:
vertx.deployVerticle(new RestApiVerticle(router))
vertx.deployVerticle(new WebSocketVerticle(router))
这些是异步操作,它们会竞相将它们的处理程序添加到共享路由器,现在可能 WebSocketVerticle
首先运行并添加事件总线处理程序,然后 RestApiVerticle
运行并尝试添加更多处理程序,这是有问题的(如上所述)。
我认为解决方案是使用组合来确保以正确的顺序添加处理程序:
vertx.deployVerticle(new RestApiVerticle(router))
.compose(1stDeploymentId ->
vertx.deployVerticle(new WebSocketVerticle(router)))
.onSuccess(2ndDeploymentId -> startPromise.complete();
.onFailure(startPromise::fail);
如果您需要记录部署 ID,您可能需要 re-arrange 组合。
我正在尝试创建 2 个 Verticle,一个用于 http 服务器,另一个用于我的 sockjs 事件总线桥。然后我试图在主应用程序中部署两个 Verticles。出于某种原因,我在 Sockjs Verticle 中收到此错误。
java.lang.IllegalStateException:此Route为已经挂载的子路由独享
Router router = Router.router(vertx);
vertx.deployVerticle(new RestApiVerticle(router))
.onFailure(startPromise::fail)
.onSuccess(id -> {
LOG.info("Deployed {} with id {}", RestApiVerticle.class.getSimpleName(), id);
startPromise.complete();
});
vertx.deployVerticle(new com.ali.websockjs.WebSocketVerticle(router))
.onFailure(startPromise::fail)
.onSuccess(id -> {
LOG.info("Deployed {} with id {}", com.ali.websockjs.WebSocketVerticle.class.getSimpleName(), id);
startPromise.complete();
});
在我的 RestApiVerticle 中
private Router router;
public RestApiVerticle(Router router) {
this.router = router;
}
router.route().handler(bodyHandler).failureHandler(FailureResponse.handleFailure());
router.route("/").handler(req -> req.response().end("Hello there!"))
.failureHandler(error -> LOG.error("Something is wrong with server!!"));
在我的 WebSocketVerticle 中,出现错误
private Router router;
public WebSocketVerticle(Router router) {
this.router = router;
}
Below code I get error
// mount the bridge on the router
router.mountSubRouter("/eventbus", subRouter).failureHandler(error -> LOG.error("error {}", error));
请帮忙!!!!!!
更新
按照您的方法在浏览器中出现 CORS 错误
Access to XMLHttpRequest at 'http://localhost:1234/eventbus/info?t=1653982669356' from origin 'http://localhost:4200' has been blocked by CORS policy:
vertx.deployVerticle(new RestApiVerticle(router))
.compose(var ->
vertx.deployVerticle(new WebSocketVerticle(router)))
.onFailure(startPromise::fail)
.onSuccess(server -> {
LOG.debug("Server and Sockjs started !!");
startPromise.complete();
});
有什么建议吗??
该错误告诉您您的设置存在配置问题。在某种程度上,这就是正在发生的事情:
你有一个路由器,在这个路由器中你有一个路由 /eventbus
将路由评估从第一个路由器传输到第二个(sockjs 路由器)。
您的代码似乎试图调用该设置两次。这意味着出了点问题。问题是,在给定的路由上,如果您将执行转移到第二个路由器,则永远不会调用第三个路由器(导致问题),因为处理现在正在第二个路由器上进行。
我想说的是,您可能需要调试应用程序启动并查看为什么多次调用设置。
我这里的假设是您看到的问题是由于部署中的竞争条件引起的。您正在呼叫:
vertx.deployVerticle(new RestApiVerticle(router))
vertx.deployVerticle(new WebSocketVerticle(router))
这些是异步操作,它们会竞相将它们的处理程序添加到共享路由器,现在可能 WebSocketVerticle
首先运行并添加事件总线处理程序,然后 RestApiVerticle
运行并尝试添加更多处理程序,这是有问题的(如上所述)。
我认为解决方案是使用组合来确保以正确的顺序添加处理程序:
vertx.deployVerticle(new RestApiVerticle(router))
.compose(1stDeploymentId ->
vertx.deployVerticle(new WebSocketVerticle(router)))
.onSuccess(2ndDeploymentId -> startPromise.complete();
.onFailure(startPromise::fail);
如果您需要记录部署 ID,您可能需要 re-arrange 组合。