|
Akka/Scala example source code file (NewRemoteActorSpec.scala)
The NewRemoteActorSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.remote
import language.postfixOps
import com.typesafe.config.ConfigFactory
import akka.actor.Actor
import akka.actor.ActorRef
import akka.actor.Props
import akka.pattern.ask
import testkit.{ STMultiNodeSpec, MultiNodeConfig, MultiNodeSpec }
import akka.testkit._
import akka.actor.Terminated
import scala.concurrent.duration._
import com.typesafe.config.ConfigFactory
object NewRemoteActorMultiJvmSpec extends MultiNodeConfig {
class SomeActor extends Actor {
def receive = {
case "identify" ⇒ sender() ! self
}
}
commonConfig(debugConfig(on = false).withFallback(
ConfigFactory.parseString("akka.remote.log-remote-lifecycle-events = off")))
val master = role("master")
val slave = role("slave")
deployOn(master, """
/service-hello.remote = "@slave@"
/service-hello3.remote = "@slave@"
""")
deployOnAll("""/service-hello2.remote = "@slave@" """)
}
class NewRemoteActorMultiJvmNode1 extends NewRemoteActorSpec
class NewRemoteActorMultiJvmNode2 extends NewRemoteActorSpec
class NewRemoteActorSpec extends MultiNodeSpec(NewRemoteActorMultiJvmSpec)
with STMultiNodeSpec with ImplicitSender with DefaultTimeout {
import NewRemoteActorMultiJvmSpec._
def initialParticipants = roles.size
// ensure that system shutdown is successful
override def verifySystemShutdown = true
"A new remote actor" must {
"be locally instantiated on a remote node and be able to communicate through its RemoteActorRef" taggedAs LongRunningTest in {
runOn(master) {
val actor = system.actorOf(Props[SomeActor], "service-hello")
actor.isInstanceOf[RemoteActorRef] should be(true)
actor.path.address should be(node(slave).address)
val slaveAddress = testConductor.getAddressFor(slave).await
actor ! "identify"
expectMsgType[ActorRef].path.address should be(slaveAddress)
}
enterBarrier("done")
}
"be locally instantiated on a remote node and be able to communicate through its RemoteActorRef (with deployOnAll)" taggedAs LongRunningTest in {
runOn(master) {
val actor = system.actorOf(Props[SomeActor], "service-hello2")
actor.isInstanceOf[RemoteActorRef] should be(true)
actor.path.address should be(node(slave).address)
val slaveAddress = testConductor.getAddressFor(slave).await
actor ! "identify"
expectMsgType[ActorRef].path.address should be(slaveAddress)
}
enterBarrier("done")
}
"be able to shutdown system when using remote deployed actor" taggedAs LongRunningTest in within(20 seconds) {
runOn(master) {
val actor = system.actorOf(Props[SomeActor], "service-hello3")
actor.isInstanceOf[RemoteActorRef] should be(true)
actor.path.address should be(node(slave).address)
// This watch is in race with the shutdown of the watched system. This race should remain, as the test should
// handle both cases:
// - remote system receives watch, replies with DeathWatchNotification
// - remote system never gets watch, but DeathWatch heartbeats time out, and AddressTerminated is generated
// (this needs some time to happen)
watch(actor)
enterBarrier("deployed")
// master system is supposed to be shutdown after slave
// this should be triggered by slave system shutdown
expectMsgPF() { case Terminated(`actor`) ⇒ true }
}
runOn(slave) {
enterBarrier("deployed")
}
// Important that this is the last test.
// It should not be any barriers here.
// verifySystemShutdown = true will ensure that system shutdown is successful
}
}
}
Other Akka source code examplesHere is a short list of links related to this Akka NewRemoteActorSpec.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.