vertX eventBus使用者侦听所有地址

时间:2015-09-22 10:47:41

标签: vert.x

我想编写一个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());
});

3 个答案:

答案 0 :(得分:1)

我不知道这是否可能,但是参考文档,你可以把一个监听器放到事件中,以了解何时调用了publish,send,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);
   });

答案 1 :(得分:1)

查看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会收到该事件,我猜那不是你想要的。

答案 2 :(得分:1)

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

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)。