取消任务

有时你想取消一个任务,使它停止对事件通知的响应。如.on().receive()的注册方法会返回一个注册对象,如果此对象的引用存在,就可以使用它来取消给定选择器(selector)的消费者或函数。

  1. EventBus bus;
  2. Registration reg = bus.on($("topic"),
  3. s -> System.out.printf("Got %s on thread %s%n", s, Thread.currentThread()));
  4. bus.notify("topic", Event.wrap("Hello World!")); (1)
  5. // ...some time later...
  6. reg.cancel(); (2)
  7. // ...some time later...
  8. bus.notify("topic", Event.wrap("Hello World!")); (3)
  1. 向指定主题发送一个事件,将会在控制台打印Event.toString()
  2. 取消注册,不再接收未来发送到消费者的事件。
  3. 这次通知将会石沉大海。

记住取消注册包含对内部注册机制的原子性访问。在一个拥有大量事件流向消费者的系统中,消费者或者函数在你执行过.cancel()方法之后以及注册机还没有抓到机会清理掉缓存及清理掉注册之前,仍然可能看到一些事件。.cancel()方法可以被描述为“请求尽可能快的取消”。

你会在测试类中注意到这种行为,当.on(), .notify().cancel() 的调用之间没有任何事件间隔时。