Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Akka流中作为单个实体处理JSON,而不是在其上迭代_Java_Akka_Akka Stream - Fatal编程技术网

Java 在Akka流中作为单个实体处理JSON,而不是在其上迭代

Java 在Akka流中作为单个实体处理JSON,而不是在其上迭代,java,akka,akka-stream,Java,Akka,Akka Stream,我正在尝试使用Akka streams将消费者与生产者联系起来 while (true) { JsonNode msg = producer.getNextDataEnvelope(); if (msg == null) { break; } System.out.println(msg.toString()); final Source<

我正在尝试使用Akka streams将消费者与生产者联系起来

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;
        }
a:{ }

先是

b: {
}
如何在akka stream中一次处理完整的JSON负载,而不是在JSON负载上迭代。

该方法从一个
Iterable
对象创建一个akka Streams
源代码。由于实现了
Iterable
,因此通过迭代其子级,流在对象中的每个值都将有一个元素

您可以使用一个元素创建一个
源代码
,但是在这种情况下,在这种方法中使用Akka流实际上没有任何好处。直接将节点传递给
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
     .map(dataEnvelope -> getJSONMessage(dataEnvelope))
     .runWith(consumer, system);

我无法控制生产者和消费者。它们由图书馆提供。我想我可以把它们包装在演员界面中。消费者也可以这样做。也可以将它们包装在Akka Streams阶段。关于这方面的许多例子,请参见Alpakka项目:是的,这些看起来很有用
producer
     .map(dataEnvelope -> getJSONMessage(dataEnvelope))
     .runWith(consumer, system);