[英]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
響應而不是實際響應最后兩個場景不太確定與數字 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);
});
這意味着:
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.