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 组合。