反应堆消费者的多线程

时间:2015-04-29 17:25:52

标签: spring spring-boot project-reactor

我正在使用reactor在整个应用程序中发布事件,并让不同的消费者对他们的事件做出回应。

这是我的反应堆配置

@Configuration
@EnableReactor
public class ReactorConfiguration {

    static {
       Environment.initializeIfEmpty().assignErrorJournal();
    }

    @Bean
    public EventBus eventBus() {
       return EventBus.config().env(Environment.get()).dispatcher(Environment.SHARED).get();
}

我期望使用基于默认环形缓冲区的调度程序,并且应该并行处理发送给单个使用者的多个消息。相反,它似乎是以同步方式处理事件。线程shared-1用于处理我的event1到consumer1,然后只有在完成event1的处理之后,同一个线程才开始在consumer1上处理event2。

如何以能够向多个消费者发送多个事件并且并行处理所有事件的方式实现并行处理。

我很感激任何建议。

这就是我将事件分派给事件总线的方法

dispatch(ReactorEvents.REPORT_REQUEST_EVENT, "", event);

protected <T> void dispatch(String selector, String info, T event) {
    eventBus.notify(selector, Event.wrap(Tuple.of(info, event)));
}

这里是消费者之一

@Consumer
public class ReportRequestHandler {
...
  @Selector(ReactorEvents.REPORT_REQUEST_EVENT)
  @Override
  public void handleRequest(Tuple2<String, ReportRequestEvent> tuple) {
    ReportRequestEvent event = tuple.getT2();
    log.debug("processing report request " + event.getId());
    ....
  }
}

1 个答案:

答案 0 :(得分:1)

默认的Ring Buffer实现是单线程的。这就是为什么你要观察你所描述的副作用。有关各种调度程序选择的更多详细信息,请查看以下链接:

http://projectreactor.io/docs/reference/#_dispatchers