Java 在Akka流中作为单个实体处理JSON,而不是在其上迭代
我正在尝试使用Akka streams将消费者与生产者联系起来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<
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);