我想在EventBus通道上发布一条消息,并接收每个正在收听该通道的人的响应。问题是,如果我不知道有多少回复,我怎么知道每个人都已经回复了?
我假设我需要知道有多少消费者,以便知道我是否已经得到了所有的响应。
有没有办法知道目前有多少消费者在"听"?到一个Vert。x EventBus地址?
EventBus works on a " best effort ";基础,所以即使你可以跟踪订阅者的数量,也有可能他们中的一些人永远不会回复你的消息。
如果你仍然倾向于尝试,我可以想到一些方法。没有一个是真正推荐的,但无论如何我都会尝试突出优点和缺点。
一种是通过反射在EventBusImpl
中得到对handlerMap
的引用。https://github.com/eclipse-vertx/vert.x/blob/master/src/main/java/io/vertx/core/eventbus/impl/EventBusImpl.java L48
如果您在应用程序启动时获得一次,这应该会对性能产生很大影响。当然,在运行时它会中断,如果。X团队决定尽可能更改字段的名称。
另一种选择是使用vertx.sharedData()
,例如getLocalMap()
。所有消费者都会将自己添加到地图中,生产者将检查地图以确定有多少消费者正在收听。这个实现的问题:
- 大量的逻辑来实现这个
- 取消消费者注册是困难的(没有保证消费者将能够取消注册自己)