发布/订阅

使用EventBus来发布,使用发布/订阅来响应事件。

Reactor的EventBus允许你注册一个消费者用于当满足某些条件的Key收到通知时来处理事件。这个功能是通过Selector来做的。它类似于订阅主题,通过ReactorSelector的实现来匹配多种判断依据,例如从Class<?>类型到正则,到Json路径表达式。这是一种十分灵活和强大的抽象,这种抽象提供了广泛的可能性。

同一个Selector可以注册在多个Consumer上,多个Selector可以匹配同一个key。这种方式很容易做聚集和广播:你可以简单的在同一个主题Selector上订阅多个消费者。

如果你更新到Reactor1.1版本,你会发现Reactor类已经不存在了。它被更名为EventBus,来更准确反馈它在框架中的角色。

使用Selector来处理事件

  1. EventBus bus = EventBus.create(Environment.get()); (1)
  2. bus.on($("topic"), (Event<String> ev) -> {
  3. String s = ev.getData();
  4. System.out.printf("Got %s on thread %s%n", s, Thread.currentThread());
  5. }); (2)
  6. bus.notify("topic", Event.wrap("Hello World!")); (3)
  1. 通过静态的Environment使用默认,共享的RingBufferDispatcher来创建EventBus
  2. 分配一个消费者用于在EventBus被通知指定key匹配到这个Selector时调用。
  3. 使用给定的主题向EventBus发布一个事件。

简写静态方法$只是等同于Selectors.object()的一个便利的助手。有些人不喜欢使用简写的方法,例如:$()ObjectSelectorR()ObjectSelectorT()ObjectSelector等等。Selector类有与简写对应的长方法名,简写是为了减少无用代码的干扰,并使代码更具可读性。