簡體   English   中英

找不到 Vertx Web 資源

[英]Vertx Web Resource Not Found

在我正在從事的項目之一中,我將路由動態注冊到Router上,如下所示。

vertx.eventBus().consumer("REGISTER_ROUTE", handler -> {
      JsonObject message = (JsonObject) handler.body();
      HttpMethod method = HttpMethod.valueOf(message.getString("method"));
      router.route(method, message.getString("url"))
        .order(1)
        .handler(cxt -> cxt.json(new JsonObject().put("message", "This works..!!")));
    });

而這個事件是從另一個像這樣的Verticle觸發的

vertx.eventBus().send("REGISTER_ROUTE",
        new JsonObject()
          .put("url", "/test-route")
          .put("method", "GET")
      );

問題是在 Windows 機器上這幾乎總是有效。 但是在 AWS 上的測試 linux 實例上

  • 我通常會收到404 Not Found響應而不是實際響應
  • 或者我得到 2 個成功響應(200)和一個 404
  • 或者我得到兩個 404 和 1 個成功響應

最后兩個場景不太確定與數字 3 的相關性(因為此成功/錯誤響應似乎在 3 個后續請求的循環中刷新)。 認為它可能是服務器 Verticle 的實例數。 但是修改實例計數也不會改變這種行為。

我有一個 404 的自定義錯誤處理程序,如下所示

router.errorHandler(404, routingContext -> {
      LOGGER.info("HTTP-404 Error Handler invoked");
      LOGGER.info("Router :" + router.toString() + " Routes Size: " + router.getRoutes().size());
      JsonObject error = new JsonObject()
        .put("error", "Resource not found");
      routingContext.response()
        .setStatusCode(404)
        .putHeader(HttpHeaders.CONTENT_TYPE, "application/json")
        .end(error.toBuffer());
    });

每當收到 404 響應時,我都可以從日志中看到路由器狀態確實顯示了一條使用給定 PATH 和 HTTP 方法組合聲明的路由。

我已經嘗試使用 HTTP 方法特定語法(如router.get(url)注冊路由,這似乎也沒有任何區別。

Vert.x 版本: 4.2.7

JDK: Eclipse 鐵木林 11.0.14.1+1

操作系統: EC2 上的 Centos 7

問題是問題並不總是發生,因此識別根本原因並修復它變得越來越困難。

如果其中有任何錯誤/遺漏,請告訴我。 我還在這里創建了一個示例項目。 這是我在實際項目中所擁有的內容的近似復制品。 注意:我在 Windows 上通常不會遇到這個問題(無論出於何種原因)。

App類中,每個 Verticle 部署了 4 個實例。

vertx.deployVerticle(Server.class.getName(), new DeploymentOptions().setInstances(4))
      .compose(server -> {
        return vertx.deployVerticle(RouteRegistration.class.getName(), new DeploymentOptions().setInstances(4))
          .onSuccess(id -> LOGGER.info("Application started Successfully"))
          .onFailure(LOGGER::catching);
      });vertx.deployVerticle(Server.class.getName(), new DeploymentOptions().setInstances(4))
      .compose(server -> {
        return vertx.deployVerticle(RouteRegistration.class.getName(), new DeploymentOptions().setInstances(4))
          .onSuccess(id -> LOGGER.info("Application started Successfully"))
          .onFailure(LOGGER::catching);
      });

這意味着:

  • 將創建一個共享的 HTTP 服務器,並在Server verticle 的實例之間對傳入的連接進行負載平衡。
  • RouteRegistration實例發送的消息將在消費者之間進行負載平衡( eventBus.send是點對點的)。

因此,連接將由具有不同設置的不同路由器處理。

在您的本地機器上,我不知道它為什么起作用,也許您部署了單個實例?

無論如何,要解決此問題,您必須在每個路由器實例中具有相同的路由器配置,因此RouteRegistration必須publish消息,以便每個消費者實例都能獲得它:

vertx.eventBus().publish("REGISTER_ROUTE",
      new JsonObject()
        .put("url", "/test-route")
        .put("method", "GET")
    );

我遇到了同樣的問題,然后切換回部署 (Supplier splv,DeploymentOptions opt),它 100% 有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM