/** * Copyright (C) 2015-2016 Lightbend Inc. */ package docs.stream.javadsl.cookbook; import akka.Done; import akka.NotUsed; import akka.actor.ActorSystem; import akka.stream.*; import akka.stream.javadsl.*; import akka.testkit.JavaTestKit; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import scala.concurrent.Future; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletionStage; public class RecipeDroppyBroadcast extends RecipeTest { static ActorSystem system; static Materializer mat; @BeforeClass public static void setup() { system = ActorSystem.create("RecipeDroppyBroadcast"); mat = ActorMaterializer.create(system); } @AfterClass public static void tearDown() { JavaTestKit.shutdownActorSystem(system); system = null; mat = null; } @Test public void work() throws Exception { new JavaTestKit(system) { //#droppy-bcast // Makes a sink drop elements if too slow public Sink> droppySink(Sink> sink, int size) { return Flow. create() .buffer(size, OverflowStrategy.dropHead()) .toMat(sink, Keep.right()); } //#droppy-bcast { final List nums = new ArrayList<>(); for (int i = 0; i < 100; i++) { nums.add(i + 1); } final Sink> mySink1 = Sink.ignore(); final Sink> mySink2 = Sink.ignore(); final Sink> mySink3 = Sink.ignore(); final Source myData = Source.from(nums); //#droppy-bcast2 RunnableGraph.fromGraph(GraphDSL.create(builder -> { final int outputCount = 3; final UniformFanOutShape bcast = builder.add(Broadcast.create(outputCount)); builder.from(builder.add(myData)).toFanOut(bcast); builder.from(bcast).to(builder.add(droppySink(mySink1, 10))); builder.from(bcast).to(builder.add(droppySink(mySink2, 10))); builder.from(bcast).to(builder.add(droppySink(mySink3, 10))); return ClosedShape.getInstance(); })); //#droppy-bcast2 } }; } }