如何使用Spring EventListener进行sendAndReceive?

时间:2018-07-26 06:51:41

标签: spring event-handling

使用来自项目反应器的(同时过时)反应堆总线,我有了API eventBus.sendAndReceive(Event e, Consumer<?> callback)

这允许通过发布事件来触发执行并自动订阅响应。

使用Spring eventListeners可以从EventListener方法发布另一个事件,但是我缺少直接订阅返回值的功能。

如何使用spring实现相同的行为?如何以编程方式注册/注销注册侦听器,以及如何使主题动态化?

1 个答案:

答案 0 :(得分:1)

使用Spring的ApplicationEventMulticaster,您无法订阅回复。您可能已经注意到onApplicationEvent method返回void!这样做的原因是,实际上,它所做的全部工作要么是同步调用订阅服务器(即ApplicationListener),要么是在执行程序上异步运行侦听器方法,而不返回任何类型的Future

Spring的Project Reactor在不久前进行了改进,以更紧密地匹配Reactive Manifesto和类似框架(例如RxJava)。现在有了Spring 5(默认情况下随Reactor一起提供),您可以互换使用Reactor和RxJava。

情况就是如此,关于您的问题:

  

如何用spring实现相同的行为?

您使用Reactor Core的新版本以及FluxMono等的功能编程功能。

  

借助Spring eventListeners,我可以从   EventListener方法,但是我直接缺少该功能   订阅返回值。

如果您look at the API for Flux,您会发现它具有流畅且功能强大的API(在某些方面类似于Java 8流)。

Flux.just(1, 2, 3, 4)
  .map(value -> value + 1)
  .subscribe(subscriber::function);

这样,您可以操作“事件”(在此示例中为1,2,3,4),对这些事件的“返回值”执行操作,然后将其通过管道传递给某些订阅者操作​​以消耗这些事件。

  

如何通过编程方式注册/注销监听器,以及如何   使主题充满活力?

您应该看看这个SO answer。 要注册/注销,您可以使用Reactor框架中的“完成器”来完成。请参见Reactor API中的take functions。他们将向上游发出信号,告知他们基本上要取消订阅,并且上游生产者应停止排放。