[英]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
轉換為Sink
或Flow
並在 stream 中進行所有處理會更有意義:
producer
.map(dataEnvelope -> getJSONMessage(dataEnvelope))
.runWith(consumer, system);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.