vertX eventBus 消费者监听所有地址

vertX eventBus consumer listens to all addresses

我想写一个 catch all eventBus 消费者。这可能吗?

eB = vertx.eventBus();

MessageConsumer<JsonObject> consumer = eB.consumer("*"); // What is catch all address ???

consumer.handler(message -> {
    Log.info("Received: " + message.body().toString());
});

我不知道这是否可行,但参考文档,您可以设置事件监听器以了解何时调用发布、发送、open_socket、close_socket

   sockJSHandler.bridge(options, be -> {
     if (be.type() == BridgeEvent.Type.PUBLISH || be.type() == BridgeEvent.Type.RECEIVE) {
       Log.info("Received: " + message.body().toString());
     }
     be.complete(true);
   });

查看了 Java 代码后,我认为这是不可能的。

Vert.x 将事件总线消费者存储在 MultiMap 中,看起来像:

AsyncMultiMap<String, ServerID>

其中 String keyconsumer address

正如您猜想的那样,Vert.x 只是做了一个 map.get(address) 来找出相关的消费者。

OP评论后更新

虽然我认为您的用例是有效的,但我认为您将不得不自己推出一些东西。

据我所知,Vert.x 不单独存储 sendpublish 的消费者。一切尽在其中 MultiMap。因此,尝试为所有事件注册消费者是不可取的。

如果有人做了 eventBus.send(),并且 Vert.x 选择了您的审计消费者,它将是 只有 consumer 接收事件,我猜这不是你想要的。

您的问题的解决方案可能是拦截器。

vertx.eventBus().addInterceptor( message -> {
          System.out.println("LOG: " + message.message().body().toString());
});

此处理程序将在 vertx 中写入到达事件总线的每条消息。

参考在这里: http://vertx.io/docs/apidocs/io/vertx/rxjava/core/eventbus/EventBus.html#addInterceptor-io.vertx.core.Handler-

此外,我使用的 vertx-core 版本是 3.3.2,我认为拦截器功能在旧版本(例如 3.0.0)中不可用。