并行消息使用Java8流API从标记分隔的输入流解组

时间:2016-02-11 13:10:28

标签: java java-8 java-stream

使用Java8流API是否可以在分隔输入流的基础上创建Message pullNext()之类的接口,其逻辑步骤如下所示?

  1. 从字符输入流中读取分隔的标记
  2. 用于并行unmarshaller的令牌(一个令牌 - >一个消息)
  3. 重新排序邮件以保留原始收到的订单
  4. 邮件可通过前面提到的pullNext()
  5. 进行播放

    有点是一个由并发池提供解组的破坏者。与此类似,也许(在InputStream之上实现stash是要整理的那个):

    Iterable<String> stash = Iterables.cycle("one", "two", "three");
    Iterator<String> sink = StreamSupport.stream(stash.spliterator(), true).
            .parallel().map((x)->x+"-unmarshalled").iterator();
    while (sink.hasNext()) process(sink.next()); // do something with decoded message
    

1 个答案:

答案 0 :(得分:2)

一个问题是parallelStream ForkJoinPool使用当前线程来贡献池。这意味着没有当前线程可以执行此操作。

这样做的唯一现实方法是在单线程执行程序中启动它以启动parallelStream执行forEach写入固定大小的BlockingQueue,并且当前线程可以使用队列的结果。 / p>

我怀疑你最好重新编写代码,这样就不需要pullNext了。 e.g。

Iterable<String> stash = Iterables.cycle("one", "two", "three");
Iterator<String> sink = StreamSupport.stream(stash.spliterator(), true).
    .parallel()
    .map(x -> x + "-unmarshalled")
    .forEach(x -> process(x));