【发布时间】:2022-12-29 11:48:09
【问题描述】:
在我正在进行的项目之一中,我将路由动态注册到 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
问题是问题并不总是发生,因此识别根本原因并修复它变得越来越困难。
如果其中有任何错误/遗漏,请告诉我。我还创建了一个示例项目here。这是我在实际项目中所拥有的内容的近似复制品。 注意:我在 Windows 上通常不会遇到这个问题(无论出于何种原因)。
【问题讨论】:
标签: java vert.x vertx4 java-vertx-web