pekko/akka-docs-dev/rst/scala/code/docs/stream/cookbook/RecipeKeepAlive.scala

72 lines
1.7 KiB
Scala
Raw Normal View History

2014-12-08 17:29:40 +01:00
package docs.stream.cookbook
import akka.stream.scaladsl._
2015-04-24 11:45:03 +03:00
import akka.stream.testkit._
2014-12-08 17:29:40 +01:00
import akka.util.ByteString
class RecipeKeepAlive extends RecipeSpec {
"Recipe for injecting keepalive messages" must {
"work" in {
type Tick = Unit
2015-04-24 11:45:03 +03:00
val tickPub = TestPublisher.probe[Tick]()
val dataPub = TestPublisher.probe[ByteString]()
val sub = TestSubscriber.manualProbe[ByteString]()
2014-12-08 17:29:40 +01:00
val ticks = Source(tickPub)
val dataStream = Source(dataPub)
val keepaliveMessage = ByteString(11)
val sink = Sink(sub)
//#inject-keepalive
val keepAliveStream: Source[ByteString, Unit] = ticks
2014-12-08 17:29:40 +01:00
.conflate(seed = (tick) => keepaliveMessage)((msg, newTick) => msg)
val graph = FlowGraph.closed() { implicit builder =>
import FlowGraph.Implicits._
val unfairMerge = builder.add(MergePreferred[ByteString](1))
2014-12-08 17:29:40 +01:00
dataStream ~> unfairMerge.preferred
// If data is available then no keepalive is injected
keepAliveStream ~> unfairMerge ~> sink
2014-12-08 17:29:40 +01:00
}
//#inject-keepalive
graph.run()
val subscription = sub.expectSubscription()
2015-04-24 11:45:03 +03:00
tickPub.sendNext(())
2014-12-08 17:29:40 +01:00
// pending data will overcome the keepalive
2015-04-24 11:45:03 +03:00
dataPub.sendNext(ByteString(1))
dataPub.sendNext(ByteString(2))
dataPub.sendNext(ByteString(3))
2014-12-08 17:29:40 +01:00
subscription.request(1)
sub.expectNext(ByteString(1))
subscription.request(2)
sub.expectNext(ByteString(2))
sub.expectNext(ByteString(3))
subscription.request(1)
sub.expectNext(keepaliveMessage)
subscription.request(1)
2015-04-24 11:45:03 +03:00
tickPub.sendNext(())
2014-12-08 17:29:40 +01:00
sub.expectNext(keepaliveMessage)
2015-04-24 11:45:03 +03:00
dataPub.sendComplete()
tickPub.sendComplete()
2014-12-08 17:29:40 +01:00
sub.expectComplete()
}
}
}