|
Akka/Scala example source code file (PeekMailboxSpec.scala)
The PeekMailboxSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.contrib.mailbox
import com.typesafe.config.ConfigFactory
import akka.actor.{ Actor, ActorSystem, DeadLetter, PoisonPill, Props, Terminated, actorRef2Scala }
import akka.testkit.{ AkkaSpec, EventFilter, ImplicitSender }
object PeekMailboxSpec {
case object Check
case object DoubleAck
class PeekActor(tries: Int) extends Actor {
var togo = tries
def receive = {
case Check ⇒
sender() ! Check
PeekMailboxExtension.ack()
case DoubleAck ⇒
PeekMailboxExtension.ack()
PeekMailboxExtension.ack()
case msg ⇒
sender() ! msg
if (togo == 0) throw new RuntimeException("DONTWANNA")
togo -= 1
PeekMailboxExtension.ack()
}
override def preRestart(cause: Throwable, msg: Option[Any]) {
for (m ← msg if m == "DIE") context stop self // for testing the case of mailbox.cleanUp
}
}
}
class PeekMailboxSpec extends AkkaSpec("""
peek-dispatcher {
mailbox-type = "akka.contrib.mailbox.PeekMailboxType"
max-retries = 2
}
""") with ImplicitSender {
import PeekMailboxSpec._
"A PeekMailbox" must {
"retry messages" in {
val a = system.actorOf(Props(classOf[PeekActor], 1).withDispatcher("peek-dispatcher"))
a ! "hello"
expectMsg("hello")
EventFilter[RuntimeException]("DONTWANNA", occurrences = 1) intercept {
a ! "world"
}
expectMsg("world")
expectMsg("world")
a ! Check
expectMsg(Check)
}
"put a bound on retries" in {
val a = system.actorOf(Props(classOf[PeekActor], 0).withDispatcher("peek-dispatcher"))
EventFilter[RuntimeException]("DONTWANNA", occurrences = 3) intercept {
a ! "hello"
}
a ! Check
expectMsg("hello")
expectMsg("hello")
expectMsg("hello")
expectMsg(Check)
}
"not waste messages on double-ack()" in {
val a = system.actorOf(Props(classOf[PeekActor], 0).withDispatcher("peek-dispatcher"))
a ! DoubleAck
a ! Check
expectMsg(Check)
}
"support cleanup" in {
system.eventStream.subscribe(testActor, classOf[DeadLetter])
val a = system.actorOf(Props(classOf[PeekActor], 0).withDispatcher("peek-dispatcher"))
watch(a)
EventFilter[RuntimeException]("DONTWANNA", occurrences = 1) intercept {
a ! "DIE" // stays in the mailbox
}
expectMsg("DIE")
expectMsgType[DeadLetter].message should be("DIE")
expectTerminated(a)
}
}
}
//#demo
class MyActor extends Actor {
def receive = {
case msg ⇒
println(msg)
doStuff(msg) // may fail
PeekMailboxExtension.ack()
}
//#business-logic-elided
var i = 0
def doStuff(m: Any) {
if (i == 1) throw new Exception("DONTWANNA")
i += 1
}
override def postStop() {
context.system.shutdown()
}
//#business-logic-elided
}
object MyApp extends App {
val system = ActorSystem("MySystem", ConfigFactory.parseString("""
peek-dispatcher {
mailbox-type = "akka.contrib.mailbox.PeekMailboxType"
max-tries = 2
}
"""))
val myActor = system.actorOf(Props[MyActor].withDispatcher("peek-dispatcher"),
name = "myActor")
myActor ! "Hello"
myActor ! "World"
myActor ! PoisonPill
}
//#demo
Other Akka source code examplesHere is a short list of links related to this Akka PeekMailboxSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.