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