vertX事件总线消费者监听所有地址

7
我想编写一个可以捕获所有事件的eventBus消费者。这个可行吗?
eB = vertx.eventBus();

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

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

你可能想要发布你想要实现的内容 - 这是为了某个记录器、审计、度量或类似的处理程序吗? - Will
对于所有上述内容以及使用不同产品(如ui.apples.braeburn、ui.apples.cox、ui.oranges.valencia)工作的处理程序,您可以监听不同的苹果或橙子,或者只是ui.*。 - rupweb
3个回答

5

1
在更新的版本中,该方法被称为 addInboundInterceptoraddOutboundInterceptor - Jonathan R

1
我不知道是否可能,但是根据文档,你可以在事件上添加监听器,以便了解何时调用了发布、发送、打开socket或关闭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

我查看了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接收事件,我猜这不是您想要的。


感谢您的评论,威尔:“就我所知,Vert.x没有将发送和发布的消费者分开存储”,哈哈,这可能会有点(不)有趣 ;) - rupweb
我正在使用eventBus.publish()而不是send()来避免你的猜测(这是正确的)。 - rupweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接