使用reactor

时间:2016-03-20 03:13:32

标签: java project-reactor

不时必须在我参与的项目中实现经典的并发生产者 - 消费者解决方案,几乎所有问题都减少了从多个线程填充的一些集合以及几个消费者正在使用的集合。 简而言之,这个集合说的是10k个实体, 一旦缓冲区大小被触发,工作者任务被提交消耗这些10k实体,这些工作者有一个限制,它设置为10,在最坏的情况下,这意味着我可以拥有多达10个工人,每个人消耗10k个实体。

我必须在这里玩一些锁定并且有一些关于缓冲区溢出的检查(生产者在所有工作人员忙于处理他们的块时生成太多数据的情况)因此必须丢弃新事件以避免OOM(不是最好的解决方案)但稳定性是p1;))

这些天看着反应堆和使用它的方式而不是低水平并完成上述所有事情,所以愚蠢的问题是:“反应堆可以用于这个用例吗?” 现在忘了溢出/丢弃..我怎样才能为广播公司实现N个消费者?

特别关注广播公司的缓冲区+线程池调度员:

void test() {
  final Broadcaster<String> sink =   Broadcaster.create(Environment.initialize());
  Dispatcher dispatcher = Environment.newDispatcher(2048, 20, DispatcherType.WORK_QUEUE);

  sink
    .buffer(100)
    .consumeOn(dispatcher, this::log);

  for (int i=0; i<100000; i++) {
    sink.onNext("elementent " + i);
    if (i%1000 == 0) {
      System.out.println("addded elements " + i);
    }
  }
}
 void log(List<String> values) {
  System.out.print("simulating slow processing....");
  System.out.println("processing: " + Arrays.toString(values.toArray()));
  try {
    Thread.sleep(1000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}

我的目的是让广播公司在达到缓冲区大小时以异步方式执行log(..),但看起来它总是在阻塞模式下执行log(...)它。执行100一次完成下一次100等等..我怎么能让它asynch?

感谢 vyvalyty

1 个答案:

答案 0 :(得分:0)

一种可能的模式是使用flatMap和publishOn:

Flux.range(1, 1_000_000)
.buffer(100)
.flatMap(b -> Flux.just(b).publishOn(SchedulerGroup.io())
   .doOnNext(this::log))
.consume(...);