add docs on how to create child actors with channels

This commit is contained in:
Roland 2013-01-31 11:40:39 +01:00
parent f86fa61613
commit 7ef5ace8d8
2 changed files with 65 additions and 4 deletions

View file

@ -13,7 +13,7 @@ import scala.concurrent.duration._
import akka.util.Timeout import akka.util.Timeout
import akka.testkit.TestProbe import akka.testkit.TestProbe
class ChannelDocSpec extends AkkaSpec { object ChannelDocSpec {
//#motivation0 //#motivation0
trait Request trait Request
@ -24,6 +24,39 @@ class ChannelDocSpec extends AkkaSpec {
case class CommandFailure(msg: String) extends Reply case class CommandFailure(msg: String) extends Reply
//#motivation0 //#motivation0
//#child
case class Stats(b: Request)
case object GetChild
case class ChildRef(child: ChannelRef[(Request, Reply) :+: TNil])
class Child extends Actor
with Channels[(Stats, Nothing) :+: TNil, (Request, Reply) :+: TNil] {
channel[Request] { (x, snd)
parentChannel <-!- Stats(x)
snd <-!- CommandSuccess
}
}
class Parent extends Actor
with Channels[TNil, (Stats, Nothing) :+: (GetChild.type, ChildRef) :+: TNil] {
val child = createChild(new Child)
channel[GetChild.type] { (_, snd) ChildRef(child) -!-> snd }
channel[Stats] { (x, _)
// collect some stats
}
}
//#child
}
class ChannelDocSpec extends AkkaSpec {
import ChannelDocSpec._
class A class A
class B class B
class C class C
@ -116,14 +149,14 @@ class ChannelDocSpec extends AkkaSpec {
extends Actor with Channels[TNil, (Request, Reply) :+: (T1, T2) :+: TNil] { extends Actor with Channels[TNil, (Request, Reply) :+: (T1, T2) :+: TNil] {
implicit val timeout = Timeout(5.seconds) implicit val timeout = Timeout(5.seconds)
//#become //#become
channel[Request] { channel[Request] {
case (Command("close"), snd) case (Command("close"), snd)
channel[T1] { (t, s) t -?-> target -!-> s } channel[T1] { (t, s) t -?-> target -!-> s }
snd <-!- CommandSuccess snd <-!- CommandSuccess
case (Command("open"), snd) case (Command("open"), snd)
channel[T1] { (_, _) } channel[T1] { (_, _) }
snd <-!- CommandSuccess snd <-!- CommandSuccess
@ -163,4 +196,20 @@ class ChannelDocSpec extends AkkaSpec {
//#usage //#usage
} }
"demonstrate child creation" in {
implicit val selfChannel = new ChannelRef[(Any, Nothing) :+: TNil](testActor)
//#child
//
// then it is used somewhat like this:
//
val parent = ChannelExt(system).actorOf(new Parent)
parent <-!- GetChild
val child = expectMsgType[ChildRef].child // this assumes TestKit context
child <-!- Command("hey there")
expectMsg(CommandSuccess)
//#child
}
} }

View file

@ -449,6 +449,18 @@ Creating top-level actors with channels is done using the ``ChannelExt`` extensi
:include: usage :include: usage
:exclude: processing :exclude: processing
Inside an actor with channels children are created using the ``createChild`` method:
.. includecode:: code/docs/channels/ChannelDocSpec.scala#child
In this example we create a simple child actor which responds to requests, but
also keeps its parent informed about what it is doing. The parent channel
within the child is thus declared to accept :class:`Stats` messages, and the
parent must consequently declare such a channel in order to be able to create
such a child. The parents job then is to create the child, make it available
to the outside via properly typed messages and collect the statistics coming in
from the child.
Implementation Restrictions Implementation Restrictions
--------------------------- ---------------------------