Класс Vert.x SockJSHandler

Я пытаюсь создать приложение веб-сокета с помощью Vert.x, и я нашел множество примеров с использованием SockJSHandler для связи с библиотекой javascript SockJS в интерфейсе приложения.

В примерах используется версия 3.5.0 Vert.x Core и Vert.x Web, и экземпляр класса создается с помощью метод SockJSHandler.create(vertx), соединяющий SockJSHandler с шиной событий Vert.x через метод SockJSHandler.bridge. Этот последний метод возвращает тип SockJSHandler, который маршрутизируется с помощью router.route("/eventbusroute/*").handler(sockJsHandler()).

Я использую последнюю версию Vert.x Core и Vert.x Web, 3.8.3, и в этом выпуске метод bridge возвращает экземпляр типа Router, как указано в документация< /а>.

Мой вопрос: как лучше всего направить экземпляр SockJSHandler Router на определенный маршрут?


person Massimiliano    schedule 19.11.2019    source источник


Ответы (2)


см. напр.

Router router = Router.router(vertx);

SockJSHandler sockJSHandler = SockJSHandler.create(vertx);
BridgeOptions options = new BridgeOptions();
// mount the bridge on the router
router.mountSubRouter("/eventbus", sockJSHandler.bridge(options));
Router router = Router.router(vertx);

    // Allow events for the designated addresses in/out of the event bus bridge
    BridgeOptions opts = new BridgeOptions()
        .addInboundPermitted(new PermittedOptions().setAddress("vertx.processor"))
        .addOutboundPermitted(new PermittedOptions().setAddress("vertx.processor"));

    // Create the event bus bridge and add it to the router.
    router.mountSubRouter("/eventbus", SockJSHandler.create(vertx).bridge(opts));
    router.route().handler(StaticHandler.create());

Код, который мне подходит:

Router router = Router.router(vertx);
BridgeOptions options = new BridgeOptions();
options.addOutboundPermitted(new PermittedOptions().setAddressRegex(".*"));
options.addInboundPermitted(new PermittedOptions().setAddressRegex(".*"));
SockJSHandler sockJSHandler = SockJSHandler.create(vertx);


router.mountSubRouter("/eventbus", sockJSHandler.bridge(options));
person Wolfgang Fahl    schedule 11.01.2020
comment
Синтаксической ошибки нет, но версия 3.8.4 несовместима с javascript. Я не мог узнать, что изменилось, и мне нужно вернуться к 3.7.1 на данный момент. - person Wolfgang Fahl; 11.01.2020

Я нашел необходимую документацию в версии 3.8.2 deprecations документация.

Правильный способ обработки возвращаемого значения SockJSHandler.bridge — включить его в качестве подмаршрутизатора.

Таким образом, вместо использования реализации SockJSHandler, такой как (до веб-версии Vert.x 3.8.2):

EventBus eventBus = vertx.eventBus();
Handler<BridgeEvent> handler = ...;
SockJSHandler sockJSHandler = SockJSHandler.create(vertx).bridge(options, handler);
Router router = Router.router(vertx);
router.route("/eventbusroute/*").handler(sockJSHandler);

Необходимо включить результат вызова метода bridge в качестве подмаршрутизатора, подобного этому (веб-версия Vert.x 3.8.2+):

EventBus eventBus = vertx.eventBus();
Handler<BridgeEvent> handler = ...;
Router sockJSSubRouter = SockJSHandler.create(vertx).bridge(options, handler);
Router router = Router.router(vertx);
router.mountSubRouter("/eventbusroute", sockJSSubRouter);
person Massimiliano    schedule 19.11.2019
comment
Что такое ... часть? - person Wolfgang Fahl; 11.01.2020
comment
Эта часть является реализацией обработчика события моста, в зависимости от конкретного приложения. Пример можно найти здесь: github.com/MaxDac/vertx-websocket-test/blob/master/src/main/ - person Massimiliano; 17.01.2020