eventBus (). consumer () никогда не вызывается - PullRequest
0 голосов
/ 07 октября 2019

Я добавил vert.x в приложение Spring Boot, добавив следующие зависимости в build.gradle:

    compile "io.vertx:vertx-core:3.8.1"
    compile "io.vertx:vertx-lang-groovy:3.8.1"

Я хочу использовать vert.x EventBus для реализации реактивного кода в одном приложении JVM(без статей).

Я проверил, что исходящие перехватчики работают и что SharedData работает. Тем не менее, нет никаких признаков того, что входящие перехватчики или потребители когда-либо были вызваны.

Я подозреваю, что есть кое-что, что я упускаю из виду при настройке vert.x или что встраивание vert.x в Spring Boot каким-то образом препятствует получениювходящие сообщения.

        Vertx vertx = Vertx.vertx();

        vertx.eventBus().addInboundInterceptor(msg -> {
            log.debug("abc inbound "+msg);
        });

        vertx.eventBus().addOutboundInterceptor(msg -> {
            log.debug("abc outbound "+msg);
        });

        vertx.eventBus().<String>consumer("abc", (Message<String> msg) -> {
            log.debug("abc handler");
        });

        vertx.eventBus().<String>localConsumer("localabc", (Message<String> msg) -> {
            log.debug("local abc handler");
        });

        vertx.eventBus().consumer("abc", msg -> {
            log.debug("abc handler 2");
        });

        vertx.eventBus().localConsumer("localabc", msg -> {
            log.debug("local abc handler 2");
        });

        MessageConsumer<String> consumer1 = vertx.eventBus().consumer("abc");
        consumer1.handler(msg -> {
            log.debug("abc handler 3");
        });

        MessageConsumer<String> consumer2 = vertx.eventBus().localConsumer("localabc");
        consumer2.handler(msg -> {
            log.debug("local abc handler 3");
        });

        LocalMap<String, String> localMap = vertx.sharedData().getLocalMap("abc");
        localMap.put("abc", "abc map");

        vertx.eventBus().publish("abc", "test", new DeliveryOptions().setLocalOnly(true));
        vertx.eventBus().publish("localabc", "localtest", new DeliveryOptions().setLocalOnly(true));
        //LocalMap<String, String> localMap = vertx.sharedData().getLocalMap("abc");
        log.debug("abc map contains "+localMap.get("abc"));

Вот вывод. Там нет никаких ошибок.

abc outbound io.vertx.core.eventbus.impl.EventBusImpl$OutboundDeliveryContext@3bab9a17
abc outbound io.vertx.core.eventbus.impl.EventBusImpl$OutboundDeliveryContext@54887f7e
abc map contains abc map

1 Ответ

1 голос
/ 08 октября 2019

Вы используете outboundInterceptor без next()

Так что он действует как фильтр. Он перехватывает все ваши сообщения и никогда не отправляет их потребителям.

Вы можете просто использовать:

vertx.eventBus().addOutboundInterceptor(msg -> {
    log.debug("abc outbound "+msg);
    msg.next();
});
...