[英]Sending data to an Akka Stream
我正在嘗試將 ArrayList 發送到 Akka stream 進行處理。 stream 處理列表如下:
1. Sum the list
2. Square the result of the sum.
我已經定義了下面的代碼來嘗試實現這個結果:
public class SumListStream {
final static akka.actor.ActorSystem system = akka.actor.ActorSystem.create("StreamsExamples");
public static void main(String[] args) throws ExecutionException, InterruptedException {
int bufferSize = 100;
final Source<Integer, ActorRef> source =
Source.actorRef(
elem -> {
// complete stream immediately if we send it Done
if (elem == Done.done()) return Optional.of(CompletionStrategy.immediately());
else return Optional.empty();
},
// never fail the stream because of a message
elem -> Optional.empty(),
bufferSize,
OverflowStrategy.dropHead());
ActorRef actorRef = source
.fold(0, (aggr, next) -> aggr + next)
.map(x -> x * x)
.to(Sink.foreach(x -> System.out.println("got: " + x)))
.run(system);
actorRef.tell(Arrays.asList(1,2,3), ActorRef.noSender());
actorRef.tell(
new akka.actor.Status.Success(CompletionStrategy.draining()), ActorRef.noSender());
}
}
發送數據到 stream 使用: actorRef.tell(Arrays.asList(1,2,3), ActorRef.noSender());
執行上述代碼的結果似乎沒有任何影響:
10:08:25.896 [StreamsExamples-akka.actor.default-dispatcher-5] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
我是否正確實施了源代碼?
我認為第一個錯誤是您根據源輸入向期望Integer
的演員發送列表。 一次發送一個 integer,例如:
Arrays.asList(1, 2, 3).forEach(i -> actorRef.tell(i, ActorRef.noSender()));
然后, fold 在發出結果之前等待源終止。 您將參與者設置為期望Done
終止,但您正在發送Status.Success
。 嘗試:
actorRef.tell(Done.done(), ActorRef.noSender());
我不是 Akka 的專家,但是通過這 2 處修改,您的代碼產生了預期的結果 (1 + 2 + 3)^2 = 36。您永遠不會停止演員系統,因此程序永遠運行,但原則是那里。
我不確定您的確切要求,但這是 stream 列表Akka Streams的一種更簡單的方法:
Source.from(Arrays.asList(1,2,3))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.