當主管調用播放器,例如:
TemplateActors.templateSupervisor ! new TemplateMessage("***POST***", 1)
下面的代碼執行(屬於同一類):
import akka.actor.{ Actor, Props, ActorLogging }
/**
* Actor TemplateSupervisor
*/
class TemplateSupervisor extends Actor with ActorLogging {
import scala.concurrent.duration._
import akka.actor.SupervisorStrategy._
import akka.actor.OneForOneStrategy
創建新從演員templateActor
演員
val templateActor = context.actorOf(Props[ TemplateActor ], "TemplateActor"))
val templateActor2 = context.actorOf(Props[ TemplateActorJuan ], "juan_carlos_actor")
查詢路徑
//log.info("path templateActor2: " + templateActor2.path)
//log.info("path templateActor: " + templateActor.path
我們發送郵件給演員:
// sent message
def receive = {
// Forward message to templateActor
case message: TemplateMessage => templateActor forward message
}
override val supervisorStrategy = OneForOneStrategy() {
case exception: Exception =>
exception.printStackTrace()
log.error(exception, exception.getMessage())
Restart
}
}
/**
* TemplateActor
*/
class TemplateActor extends Actor with ActorLogging {
import akka.pattern._
import scala.concurrent.{Future, ExecutionContext}
implicit val _: ExecutionContext = context.dispatcher
val actor = context.actorSelection("//ms-service-executor/user/TemplateSupervisor/juan_carlos_actor")
def receive = {
case message: TemplateMessage =>
log.info("************Realizando PING from TemplateActor")
actor ! new PING("PING")
case message: PONG =>
log.info("************PONG make in TemplateActor")
}
}
/**
* TemplateActorJuan
*/
class TemplateActorJuan extends Actor with ActorLogging {
import akka.pattern._
import scala.concurrent.{Future, ExecutionContext}
implicit val _: ExecutionContext = context.dispatcher
val actor = context.actorSelection("//ms-service-executor/user/TemplateSupervisor/TemplateActor")
def receive = {
case message: PING =>
log.info("************make PONG from TemplateActorJuan")
actor ! new PONG("PONG")
}
}
case class PING(val id: String)
case class PONG(val id: String)
TemplateActors
類
import akka.actor.{ Props, ActorSystem }
import TemplateSupervisor
/**
* Method override for the unique ActorSystem instance
*/
trait Core {
implicit def system: ActorSystem
}
/**
* Definition of the ActorSystem and the ExecutionContext
*/
trait BootedCore extends Core {
import scala.concurrent.ExecutionContext
implicit lazy val system = ActorSystem("ms-service-executor")
implicit lazy val ex: ExecutionContext = system.dispatcher
sys.addShutdownHook(system.shutdown())
}
/**
* Template project actors instantiation
*/
trait CoreActors { this: Core =>
/*
* Creacion del actor "TemplateSupervisor"
* Props: configuracion del actor
* system: unico actor existente
*/
val templateSupervisor = system.actorOf(Props[ TemplateSupervisor ], "TemplateSupervisor")
}
/**
* Template actor references
*/
object TemplateActors extends BootedCore with CoreActors
這取決於其他的演員應該用怎麼辦請求?另一個actor是否也包含路由?或者它只是爲這個確切的請求產生一個結果? – jrudolph
它應該產生一個結果,但我仍然需要Request對象。所以可以有整個請求,或者可以發送一個包含它的類加上其他數據。 – gotch4
只是爲了表明它可以完成,看看這個傢伙代碼: https://github.com/mhamrah/spray-sample/blob/master/src/main/scala/basic/BasicSample。scala – byrnedo