我们可以并行处理每个多管道步骤吗?

问题描述

假设我们有:

  • 一个 URL 列表,这是我们 Multi 的来源
  • 作为第一步,我们使用 HTTP 客户端调用获取此页面的 HTML
  • 然后我们尝试找到一些特定的标签并获取其内容
  • 然后我们将找到的东西存储到数据库中

现在我们有 3 个步骤。有没有办法如何并行运行这些步骤?我的意思是一段时间后它应该:抓取 HTML 并同时处理 html + 获取标签内容,同时将数据从已经处理过的项目保存到数据库中。(希望我在这里的意思很明显)这样我们就可以进行并行处理。默认情况下,我所看到的是,mutiny 以串行方式进行。

这是一个例子:

  @Test
  public void test3() {
    Multi<String> source = Multi.createFrom().items("a","b","c");
    source
            .onItem().transform(i -> trans(i,"-step1"))
            .onItem().transform(i -> trans(i,"-step2"))
            .onItem().transform(i -> trans(i,"-step3"))
            .subscribe().with(item -> System.out.println("Subscriber received " + item));
  }


  private String trans(String s,String add) {
    int t = new Random().nextInt(4) * 1000;
    try {
      print("Sleeping for '" + s + "' miliseconds: " + t);
      Thread.sleep(t);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    return s + add;
  }

现在报告以下控制台输出:

Sleeping for 'a' miliseconds: 2000
Sleeping for 'a-step1' miliseconds: 3000
Sleeping for 'a-step1-step2' miliseconds: 3000
Subscriber received a-step1-step2-step3
Sleeping for 'b' miliseconds: 0
Sleeping for 'b-step1' miliseconds: 0
Sleeping for 'b-step1-step2' miliseconds: 0
Subscriber received b-step1-step2-step3
Sleeping for 'c' miliseconds: 1000
Sleeping for 'c-step1' miliseconds: 3000
Sleeping for 'c-step1-step2' miliseconds: 3000
Subscriber received c-step1-step2-step3

可以看到它不是并行运行的。我在这里错过了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)