【发布时间】:2021-10-16 22:53:18
【问题描述】:
我想在 EventBus 频道上发布一条消息,并收到所有收听该频道的人的回复。问题是,如果我不知道预期会有多少回复,我怎么知道每个人都已经回复了?
我假设我需要知道有多少消费者才能知道我是否已经收到所有回复。
有什么方法可以知道当前有多少消费者正在“收听”一个 Vert.x EventBus 地址?
【问题讨论】:
标签: java asynchronous vert.x vertx-eventbus
我想在 EventBus 频道上发布一条消息,并收到所有收听该频道的人的回复。问题是,如果我不知道预期会有多少回复,我怎么知道每个人都已经回复了?
我假设我需要知道有多少消费者才能知道我是否已经收到所有回复。
有什么方法可以知道当前有多少消费者正在“收听”一个 Vert.x EventBus 地址?
【问题讨论】:
标签: java asynchronous vert.x vertx-eventbus
EventBus 在“尽力而为”的基础上工作,因此即使您可以跟踪订阅者的数量,他们中的一些人也有可能永远不会回复您的消息。
如果您仍然想尝试一下,我可以通过几种方法来简化它。没有一个是真正推荐的,但我会尽量强调优点和缺点。
一种是通过反射在EventBusImpl 中获得对handlerMap 的引用。
https://github.com/eclipse-vertx/vert.x/blob/master/src/main/java/io/vertx/core/eventbus/impl/EventBusImpl.java#L48
如果你得到它一次,当你的应用程序启动时,那应该会对性能产生很大影响。当然,如果 Vert.x 团队决定尽可能多地更改字段名称,这将在运行时中断。
另一个选项是使用vertx.sharedData(),例如getLocalMap()。所有消费者将自己添加到地图中,生产者将检查地图以确定有多少消费者正在收听。该实现的问题:
【讨论】: