如何使用Reactor framework 2.x执行多线程map / reduce?

时间:2015-01-15 19:18:05

标签: java multithreading concurrency mapreduce reactor

我之前曾向this question询问Reactor 1.x:

  

假设我有Collection<Map>。我想:

     

将每个Map实例同时转换为类型为Foo的对象(每个实例完全独立于另一个实例 - 不需要按顺序/迭代地转换每个实例)。

     

当所有转换后,我想要一个方法onReduce(Collection<Foo> foos)被调用 - 该参数包含所有生成的Foo个实例。

但我们似乎无法找到Reactor 2.x的等效解决方案 - 只需单线程。

如何在Reactor 2.x中执行多线程映射/缩减?例如,如何使用基于ExecutorService的Dispatcher执行此操作?

1 个答案:

答案 0 :(得分:2)

现在使用Reactor 2.0非常容易。你可以这样做:

List<Map<String, Object>> data = readData(); // <1>

Streams.from(data)
       .flatMap(m -> Streams.just(m)
                            .dispatchOn(Environment.cachedDispatcher()) // <2>
                            .map(ignored -> Thread.currentThread().getName()))
       .buffer() // <3>
       .consume(s -> System.out.println("s: " + s)); // <4>
  1. 根据输入数据创建Stream
  2. 为每个Stream创建一个新的Map,并在给定的Dispatcher上调度地图操作。
  3. 缓冲所有值,直到完成,当清空集合时,将向下游发送。
  4. 消耗列表,它是来自子流的负载平衡变换的结果。