pekko/akka-docs/src/test/scala/docs/cluster/FactorialBackend.scala

56 lines
1.4 KiB
Scala
Raw Normal View History

/*
* Copyright (C) 2018-2020 Lightbend Inc. <https://www.lightbend.com>
*/
package scala.docs.cluster
import scala.annotation.tailrec
import scala.concurrent.Future
import com.typesafe.config.ConfigFactory
import akka.actor.Actor
import akka.actor.ActorLogging
import akka.actor.ActorSystem
import akka.actor.Props
import akka.pattern.pipe
//#backend
class FactorialBackend extends Actor with ActorLogging {
import context.dispatcher
def receive = {
case (n: Int) =>
2019-03-11 10:38:24 +01:00
Future(factorial(n))
.map { result =>
(n, result)
}
.pipeTo(sender())
}
def factorial(n: Int): BigInt = {
@tailrec def factorialAcc(acc: BigInt, n: Int): BigInt = {
if (n <= 1) acc
else factorialAcc(acc * n, n - 1)
}
factorialAcc(BigInt(1), n)
}
}
//#backend
object FactorialBackend {
def main(args: Array[String]): Unit = {
// Override the configuration of the port when specified as program argument
val port = if (args.isEmpty) "0" else args(0)
2019-03-11 10:38:24 +01:00
val config = ConfigFactory
.parseString(s"akka.remote.classic.netty.tcp.port=$port")
2019-03-11 10:38:24 +01:00
.withFallback(ConfigFactory.parseString("akka.cluster.roles = [backend]"))
.withFallback(ConfigFactory.load("factorial"))
val system = ActorSystem("ClusterSystem", config)
system.actorOf(Props[FactorialBackend], name = "factorialBackend")
system.actorOf(Props[MetricsListener], name = "metricsListener")
}
2017-10-06 10:30:28 +02:00
}