我想编写一个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());
});
答案 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 key
是consumer address
。
正如您所猜测的那样,Vert.x
只需要map.get(address)
来找出相关的消费者。
OP评论后更新
虽然我认为您的用例是有效的,但我认为您将不得不自己滚动一些东西。
据我所知,Vert.x不会单独存储send
和publish
的使用者。它只在一个MultiMap
中。因此,尝试为所有活动注册消费者是不明智的。
如果某人有eventBus.send()
,而Vert.x会选择您的审核用户,则仅 consumer
会收到该事件,我猜那不是你想要的。
答案 2 :(得分:1)
您的问题的解决方案可能是拦截器。
vertx.eventBus().addInterceptor( message -> {
System.out.println("LOG: " + message.message().body().toString());
});
此处理程序将在vertx中写入事件总线的每条消息。
此外,我使用的vertx-core版本是3.3.2,我认为拦截器功能在旧版本中不可用(例如3.0.0)。