使用Reactor或RxJava的Batching Publisher

时间:2019-06-25 22:33:41

标签: java rx-java2 project-reactor reactor

问题(简化):我有很多事件需要发布到RabbitMQ,为了提高效率,我想批处理消息然后发布它们。这些事件在多个线程上并且正在同时创建

使用反应器3.2.8。释放


eventProcessor = EmitterProcessor.create(batchingProperties.getOverflowBufferSize(), true);
eventSink = eventProcessor.sink(FluxSink.OverflowStrategy.LATEST);
eventProcessor
  .bufferTimeout(batchingProperties.getBufferSize(),
     Duration.ofSeconds(batchingProperties.getBufferSeconds()), 
     eventPublisherScheduler)
   .parallel()
   .runOn(eventPublisherScheduler)
   .map(list -> batchFunction.apply(list))
   .subscribe(this::processEventList, this::processEventError, this::processComplete);

我只是从多个线程发布这样的内容

eventSink.next(event);

这不起作用,我不确定如何使它起作用,因为我收到了丢失的消息,这些消息被静默丢弃。

问题1:如何正确打印掉信?

如果我添加

.onBackpressureBuffer(100, item -> {
  LOGGER.error("dropping {}", item);
 })

在bufferTimeout之前,我得到一个错误:

reactor.core.Exceptions $ OverflowException:接收器溢出的信号超出了预期的数量(受限制的队列...)

问题2: 如何正确实施此方法,显然我做不到这一点?

问题3: 我如何做到这一点,以便它阻止调用eventSink.next(event)的线程,而不是获取overflowException?

0 个答案:

没有答案