Vert.x将HttpServerRequest发布到其他模块

时间:2014-11-13 21:51:35

标签: http vert.x

如果我在处理程序中收到HttpServerRequest,是否可以以某种方式发布请求?

我想实现一个带有index.html和未知数量的子站点的小型演示网站。首先应该有一个主vert.x模块,它启动HttpServer。在这个主模块中,应该可以添加其他相关模块。我现在称它们为子模块。我不知道稍后会有多少个子模块,但每个子模块应该包含处理特定URL(子html文件)的http响应的逻辑。我想我必须为WebSocketHandler做同样的事情......

start()中代码的一个小例子:

    //My Main Module:
    vertx.createHttpServer().requestHandler(new Handler<HttpServerRequest>() {
        public void handle(HttpServerRequest req) {
            vertx.eventBus().publish("HTTP_REQUEST_CONSTANT", req);
        }
    }).listen(8080);


    // My submodule 1
    vertx.eventBus().registerHandler("HTTP_REQUEST_CONSTANT", new Handler<HttpServerRequest>() {
        @Override
        public void handle(HttpServerRequest req) {
            if (req.uri().equals("/")) {
                req.response();
            }
        }
    });

    // Other submodules which handles other URLs

还是其他任何解决方案?我只是不想在主模块中拥有子站点的逻辑。

编辑:或者我可以在每个子模块中调用vertx.createHttpServer()方法吗?

1 个答案:

答案 0 :(得分:2)

我有一个类似的基于Vert.x的应用程序,我最终做了以下事情: 我有HttpServerVerticleMainVerticle开始。在那里,我创建了一个HttpServer与几个匹配器。每个匹配器都会收到一个请求,并通过EventBus将其转发到专用的Verticle。在从专用Verticle获得响应后,它会将响应写入响应。 这是一段代码:

RouteMatcher restMatcher = new RouteMatcher();
EventBus eventBus = vertx.eventBus();
HttpServer httpServer = vertx.createHttpServer();

restMatcher.post("/your/url",
            r -> {
                r.bodyHandler(requestBody -> {
                    final int length = requestBody.length();
                    if(length == 0) {
                        //return bad request
                        r.response().setStatusCode(HttpResponseStatus.BAD_REQUEST.code());
                        r.response().end();
                        return;
                    }

                    eventBus.send("your.address.here",
                            requestBody.getString(0, length),
                            new Handler<Message<JsonObject>>(){
                                @Override
                                public void handle(Message<JsonObject> message) {
                                    //return the response from the other verticle
                                    r.response().setStatusCode(HttpResponseStatus.OK.code());
                                    if (message.body() != null) {
                                        r.response().end(message.body().toString());
                                    }
                                    else{
                                        r.response().end();
                                    }
                                }
                            });

                });
            });

httpServer.requestHandler(restMatcher);
httpServer.listen(yourPort,yourHost);

在专用的Verticle中,您可以将侦听器注册到地址:

 vertx.eventBus().registerHandler("your.address.here", this::yourHandlerMethod);

处理程序方法如下所示:

protected void yourHandlerMethod(Message<String> message){
    // do your magic, produce an answer
    message.reply(answer);
}

通过这种方式,您可以将逻辑与HTTP映射分开,并且可以使用多个事件总线地址在不同的Verticle中使用不同的逻辑块。

希望这有帮助。