/* * Copyright (C) 2018-2020 Lightbend Inc. */ 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) => 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) val config = ConfigFactory .parseString(s"akka.remote.classic.netty.tcp.port=$port") .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") } }