2014-11-13 4 views
1

если я получаю HttpServerRequest в обработчике, как-то можно опубликовать запрос?Vert.x опубликовать HttpServerRequest другому модулю

Я хочу реализовать небольшой демонстрационный сайт с индексом index.html и неизвестным количеством подсайтов. Сначала должен быть основной модуль vert.x, который запускает HttpServer. В этом основном модуле должно быть возможно добавить другие зависимые модули. Сейчас я буду называть их подмодулями. Я не знаю, сколько подмодулей я буду иметь позже, но каждый подмодуль должен содержать логику для обработки ответа HTTP для определенного URL (файлы sub html). Я предполагаю, что я должен сделать то же самое для WebSocketHandler ...

Небольшой пример кода в начале():

//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() в каждом подмодуле?

+0

Играл с этим немного, но не нашел самостоятельного пути. «самодостаточный» смысл, в отличие от внешнего веб-прокси (apache и т. д.), который отображает разные пути к модулям, каждый из которых запускает собственный HTTP-прослушиватель на разных портах. Однако это не удобно для развития. Хороший вопрос. – tariksbl

ответ

1

У меня есть аналогичное приложение на основе Vert.x, и я закончил делать следующее: У меня есть HttpServerVerticle, который начинается с MainVerticle. Там я создал HttpServer с несколькими помощниками. Каждый соединитель получает запрос и перенаправляет его на выделенную вертикальную точку через EventBus. Получив ответ от выделенной вершины, он записывает ответ на ответ. Вот фрагмент кода:

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 и можете иметь разные части логики в отдельных вертикалях, используя несколько адресов шины событий.

Надеюсь, это поможет.

Смежные вопросы