簡體   English   中英

將 JSON 處理為 Akka stream 中的單個實體,而不是對其進行迭代

[英]Process JSON as single entity in Akka stream rather that iterating over it

我正在嘗試使用 Akka 流將消費者與生產者聯系起來。

while (true) {
            JsonNode msg = producer.getNextDataEnvelope();
            if (msg == null) {
                break;
            }
            System.out.println(msg.toString());
            final Source<JsonNode, NotUsed> source = Source.from(getJSONMessage(msg));
            final Sink<JsonNode, CompletionStage<Done>> sink =
              Sink.foreach(receivedMsg -> consumer.sendJson((ObjectNode) receivedMsg));

            final RunnableGraph<CompletionStage<Done>> runnable = source.toMat(sink, Keep.right());
            final CompletionStage<Done> producerConsumer = runnable.run(system);
            Thread.sleep(1);
        }

        private static ObjectNode getJSONMessage(JsonNode message) {
          JsonNode pipelineMsg = message.get(KEYNAME);
          return (ObjectNode)pipelineMsg;
        }

getJSONMessage 之后產生的 json 是這樣的

{
  a: {
  },
  b: {
  }
}

When this JSON goes to consumer it is processing it as 

一個: { }

首先然后

b: {
}

我將如何在 akka-stream 中一次處理完整的 JSON 有效負載,而不是遍歷 JSON 有效負載。

Source.from方法從可迭代的Iterable創建 Akka 流Source 由於ObjectNode實現了Iterable<JsonNode> ,通過迭代其子節點,您的 stream 將在 object 中的每個值都有一個元素。

您可以使用Source.single創建一個包含一個元素的Source ,但在這種情況下,在這種方法中使用 Akka Streams 確實沒有任何好處。 將節點直接傳遞給consumer.sendJson會更直接,如下例所示:

while (true) {
    JsonNode msg = producer.getNextDataEnvelope();
    if (msg == null) {
        break;
    }
    System.out.println(msg.toString());
    ObjectNode receivedMsg = getJSONMessage(msg);
    consumer.sendJson(receivedMsg);
}

private static ObjectNode getJSONMessage(JsonNode message) {
    JsonNode pipelineMsg = message.get(KEYNAME);
    return (ObjectNode)pipelineMsg;
}

另一方面,如果您確實想利用 Akka 流,將producer轉換為Source<JsonNode> ,將consumer轉換為SinkFlow並在 stream 中進行所有處理會更有意義:

producer
     .map(dataEnvelope -> getJSONMessage(dataEnvelope))
     .runWith(consumer, system);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM