|
Akka/Scala example source code file (RestartFirstSeedNodeSpec.scala)
The RestartFirstSeedNodeSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.cluster
import language.postfixOps
import scala.collection.immutable
import com.typesafe.config.ConfigFactory
import org.scalatest.BeforeAndAfter
import akka.remote.testkit.MultiNodeConfig
import akka.remote.testkit.MultiNodeSpec
import akka.testkit._
import scala.concurrent.duration._
import akka.actor.Address
import akka.actor.ActorSystem
import akka.actor.Props
import akka.actor.Actor
import akka.actor.RootActorPath
import akka.cluster.MemberStatus._
import akka.actor.Deploy
object RestartFirstSeedNodeMultiJvmSpec extends MultiNodeConfig {
val seed1 = role("seed1")
val seed2 = role("seed2")
val seed3 = role("seed3")
commonConfig(debugConfig(on = false).
withFallback(ConfigFactory.parseString("akka.cluster.auto-down-unreachable-after = 0s")).
withFallback(MultiNodeClusterSpec.clusterConfig))
}
class RestartFirstSeedNodeMultiJvmNode1 extends RestartFirstSeedNodeSpec
class RestartFirstSeedNodeMultiJvmNode2 extends RestartFirstSeedNodeSpec
class RestartFirstSeedNodeMultiJvmNode3 extends RestartFirstSeedNodeSpec
abstract class RestartFirstSeedNodeSpec
extends MultiNodeSpec(RestartFirstSeedNodeMultiJvmSpec)
with MultiNodeClusterSpec with ImplicitSender {
import RestartFirstSeedNodeMultiJvmSpec._
@volatile var seedNode1Address: Address = _
// use a separate ActorSystem, to be able to simulate restart
lazy val seed1System = ActorSystem(system.name, system.settings.config)
def missingSeed = address(seed3).copy(port = Some(61313))
def seedNodes: immutable.IndexedSeq[Address] = Vector(seedNode1Address, seed2, seed3, missingSeed)
lazy val restartedSeed1System = ActorSystem(system.name,
ConfigFactory.parseString("akka.remote.netty.tcp.port=" + seedNodes.head.port.get).
withFallback(system.settings.config))
override def afterAll(): Unit = {
runOn(seed1) {
if (seed1System.isTerminated)
shutdown(restartedSeed1System)
else
shutdown(seed1System)
}
super.afterAll()
}
"Cluster seed nodes" must {
"be able to restart first seed node and join other seed nodes" taggedAs LongRunningTest in within(40 seconds) {
// seed1System is a separate ActorSystem, to be able to simulate restart
// we must transfer its address to seed2 and seed3
runOn(seed2, seed3) {
system.actorOf(Props(new Actor {
def receive = {
case a: Address ⇒
seedNode1Address = a
sender() ! "ok"
}
}).withDeploy(Deploy.local), name = "address-receiver")
enterBarrier("seed1-address-receiver-ready")
}
runOn(seed1) {
enterBarrier("seed1-address-receiver-ready")
seedNode1Address = Cluster(seed1System).selfAddress
List(seed2, seed3) foreach { r ⇒
system.actorSelection(RootActorPath(r) / "user" / "address-receiver") ! seedNode1Address
expectMsg(5 seconds, "ok")
}
}
enterBarrier("seed1-address-transfered")
// now we can join seed1System, seed2, seed3 together
runOn(seed1) {
Cluster(seed1System).joinSeedNodes(seedNodes)
awaitAssert(Cluster(seed1System).readView.members.size should be(3))
awaitAssert(Cluster(seed1System).readView.members.map(_.status) should be(Set(Up)))
}
runOn(seed2, seed3) {
cluster.joinSeedNodes(seedNodes)
awaitMembersUp(3)
}
enterBarrier("started")
// shutdown seed1System
runOn(seed1) {
shutdown(seed1System, remainingOrDefault)
}
runOn(seed2, seed3) {
awaitMembersUp(2, canNotBePartOfMemberRing = Set(seedNodes.head))
awaitAssert(clusterView.unreachableMembers.map(_.address) should not contain (seedNodes.head))
}
enterBarrier("seed1-shutdown")
// then start restartedSeed1System, which has the same address as seed1System
runOn(seed1) {
Cluster(restartedSeed1System).joinSeedNodes(seedNodes)
awaitAssert(Cluster(restartedSeed1System).readView.members.size should be(3))
awaitAssert(Cluster(restartedSeed1System).readView.members.map(_.status) should be(Set(Up)))
}
runOn(seed2, seed3) {
awaitMembersUp(3)
}
enterBarrier("seed1-restarted")
}
}
}
Other Akka source code examplesHere is a short list of links related to this Akka RestartFirstSeedNodeSpec.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.